2011-01-28 14 views
5
class DonkeyBattler { 

    static void doBattle(){ 
     System.out.println("Weaponized donkey battling"); 
    } 

} 

class FunkyBattler extends DonkeyBattler { 

    static void doBattle(){ 
     System.out.println("Weaponized donkey battling with bellbottoms"); 

    } 
} 

Il metodo doBattle dovrebbe essere una ridefinizione o un override? Oh, questo è Java, a proposito.Qual è la differenza tra ridefinire un metodo e sovrascrivere un metodo?

+0

Ridefinizione. L'override funziona solo con i metodi di istanza ereditati. – helpermethod

+1

Che cos'è la "ridefinizione"? Definiscilo o fornisci un link per portarci sulla stessa pagina. –

risposta

5

Il termine "ridefinizione" non viene solitamente utilizzato per quanto riguarda i metodi Java e l'ereditarietà. Esistono due termini comunemente usati: "override" come hai detto e "overload". Sovraccaricare in Java è creare due metodi nella stessa classe con lo stesso nome ma diverse firme (numero e/o tipi di argomenti). Per esempio:

public interface MyInterface 
{ 
    public int doStuff(int first, int second); 
    public int doStuff(double only); 
} 

Per ignorare è di fare qualcosa di simile a quello che state facendo nel tuo esempio: creare una classe bambino con un metodo che ha lo stesso nome e firma come metodo nella classe padre che verrà essere utilizzato per tutte le istanze della classe figlio ma non della classe genitore o di altre classi figlie di quel genitore.

L'unico problema relativo al sovraccarico è l'utilizzo della parola chiave static. L'override è determinata dinamicamente, ma i metodi statici per definizione non lo sono.

+2

Avere due metodi statici chiamati lo stesso è come se avessi due metodi completamente diversi? – overmann

+1

Se sono in classi diverse, sì, perché hanno spazi dei nomi completamente diversi * (che includono il nome della classe). A fini di leggibilità, può essere utile o meno a seconda di quanto sono correlati. – justkt

+0

Il metodo statico della classe genitore può essere riaffermato dalla classe figlio, che nasconde il metodo statico della classe genitore. Questo è noto come ridefinizione in Java. – Ghos3t

12

Non ho mai sentito parlare di "ridefinire" come termine OO applicato a Java.

Tuttavia, l'esempio che dai è non prioritario, perché i metodi statici non sono ereditati, ma vengono spediti staticamente in base al tipo di variabile (in contrasto con l'invio dinamica che si verifica con metodi utente).

Io non lo definirei un re definizione, anche se - si ha un metodo chiamato DonkeyBattler.doBattle, e ora che hai definito un metodo separato compiletely chiamato FunkyBattler.doBattle.

2

È totalmente un concetto errato che un metodo possa essere sovraccaricato solo nella stessa classe. Invece il metodo può essere sovraccarico anche nella sottoclasse.

0

La ridefinizione è valida per Java ed è per metodi statici. Se vuoi cambiare il metodo statico per la tua classe, puoi ridefinirlo. Questo non è influenzato dal polimorfismo poiché non si applica ai metodi statici.

Utilizzando l'esempio tutte le chiamate al nome classe o tutte le sottoclassi otterranno il metodo originale doBattle(). Una chiamata specifica a FunkyBattler.doBattle() invoca il metodo statico ridefinito nella classe FunkyBattler.

3

Intenzione di eseguire l'override in realtà Ridefinisce il metodo ereditato dalla classe padre.

Ridefinizione comporta:

  1. sostituzione

    1. **Replacement** is the case in which child class is overriding 
    

    Il metodo ereditato della classe genitore con un comportamento (funzionalità), completamente diversa dalla corrispondente metodo genitore e un segno per questo processo non è chiamando super.method() nel corpo del metodo figlio.

  2. Affinamento

    2. Refinement is the case in which child is overriding inherited 
    

    Il metodo da genitore con una funzionalità relative alla funzionalità metodo genitore, segno di questo processo sta chiamando generalmente super.method() nel corpo del metodo di bambino.

0

Hai metodo "doBattle" quali è statica e metodi statici di Java non può essere sostituito, questo non significa che non possono essere ridefiniti in una sottoclasse, Così qui si sta ridefinendo il metodo doBattle in FunkyBattler classe una sottoclasse di DonkeyBattler

-1

ridefinizione e override viene fornito con negli stessi scenari. L'unica differenza è che se i metodi utilizzati sono statici, la sua ridefinizione.

es:

Overriding:

Class A{ 
     public void show(){ 
      SOP("class a"); 
     } 
    } 

    Class B extends A{ 
    public void show(){ 
     SOP("class B"); 
    } 
    } 

Ridefinizione:

Class A{ 
     public static void show(){ 
      SOP("class a"); 
     } 
    } 

    Class B extends A{ 
    public static void show(){ 
     SOP("class B"); 
    } 
    } 

Nota: I metodi statici sembra come se sono rided troppo, ma in realtà sono ridefiniti.

  1. La ridefinizione è con metodi statici.
  2. I metodi statici sono associati a Class e non a Object, quindi non eseguiamo l'override come per l'istanza per l'esecuzione.
  3. In caso di elettricità statica, stiamo semplicemente ridefinendo il metodo.
0
public class Animal{ 
      public static void doStuff(){ 
       System.out.println("In animal"); 
      } 
    } 

    public class Dog extends Animal { 


    //redifinition of the method, since it is... Static 
    static void doStuff() { 
     System.out.println("In Dog..."); 
    } 

    public static void main(String[] args) { 
     Animal animal = new Dog(); 

     animal.doStuff(); 
    } 
} 

L'uscita sara 'in animali', anche se si chiama il metodo statico di riferimento al cane, si dovrebbe dedurre allora che il polimorfismo runtime non funziona come con prevalente.

2

Esclusione e ridefinizione (noto anche come nascondiglio) sono quasi la qualche cosa, tranne:

principale è per i metodi di istanza e ridefinire o nascondere è per i metodi di classe. La ridefinizione è solo nel caso di metodi statici in quanto i metodi statici non hanno un polimorfismo a tempo di esecuzione.

prega di fare riferimento al codice qui sotto per chiarimenti:

class Foo { 
    public static void classMethod() 
    { 

     SOP("classMethod() in Foo"); 
    } 

    public void instanceMethod() 
    { 
     SOP ("instanceMethod() in Foo"); 
    } 
     } 

class Bar extends Foo { 
    public static void class Method() 
    { 
     SOP ("classMethod() in Bar"); 
    } 

    public void instanceMethod() { 
     SOP ("instanceMethod() in Bar"); 
    } 
      } 

class Test { 
    public static void main(String[] args) { 
     Foo f = new Bar(); 
     f.instanceMethod(); 
     f.classMethod(); 
    } 
} 

L'uscita per questo codice è: instanceMethod() nella barra classmethod() in Foo

Motivo per questa uscita:

Poiché instanceMethod() è un metodo di istanza, in cui la barra esegue l'override del metodo da Foo, in fase di esecuzione la JVM usa la classe effettiva dell'istanza f per determinare quale metodo eseguire. Sebbene f sia stato dichiarato come Foo, l'istanza effettiva che abbiamo creato era una nuova barra().Quindi in fase di esecuzione, il J.V.M. trova che f è un'istanza di Bar, e quindi chiama instanceMethod() in Bar piuttosto che in Foo.

Con classMethod(), poiché è un metodo di classe, il compilatore e J.V.M. non aspettarti di aver bisogno di un'istanza reale per invocare il metodo. E anche se fornisci uno J.V.M. non lo guarderò mai. Il compilatore esaminerà solo il tipo dichiarato del riferimento e utilizzerà quel tipo dichiarato per determinare, in fase di compilazione, quale metodo chiamare. Poiché f è dichiarato come tipo Foo, il compilatore guarda f.classMethod() e decide che significa Foo. metodo di classe. Non importa che l'istanza a cui fa riferimento f sia in realtà una barra: per i metodi statici, il compilatore utilizza solo il tipo dichiarato del riferimento.

Ecco perché all'inizio ho detto che un metodo statico non ha il polimorfismo di runtime.

Problemi correlati