Perché sovrascrivere un metodo statico non causa il polimorfismo in Java

0

Molti dicono che non possiamo sovrascrivere un metodo statico.

Ma possiamo scavalcare un metodo statico.

La domanda è, quando sostituiamo un metodo statico, perché non risulta nel polimorfismo?

    
posta Harish_N 04.10.2014 - 09:22
fonte

3 risposte

11

Domanda interessante, l'ho testata in questo modo:

superclasse

public class ClassA {       
    public static void printStatic(){
        System.out.println("hi static from A");
    }       
    public void printDynamic(){
        System.out.println("hi dynamic from A");
    }       
}

sottoclasse

public class ClassB extends ClassA {
    public static void printStatic(){
        System.out.println("hi static from B");
    }
    public void printDynamic(){
        System.out.println("hi dynamic from B");
    }   

}

Codice di prova

public static void main (String args[]){
    ClassA x1 = new ClassB();
    x1.printStatic();
    x1.printDynamic();
    ClassB x2 = new ClassB();
    x2.printStatic();
    x2.printDynamic();
}

Output

hi static from A
hi dynamic from B
hi static from B
hi dynamic from B

Analisi dell'output di test

Se si chiama un metodo statico, il metodo viene sempre eseguito nel tipo dichiarante, non nel metodo sovrascritto nel tipo istanziato (nessun polimorfismo), mentre il richiamo di un metodo dinamico esegue sempre il metodo sovrascritto nel tipo istanziato (polimorfismo).

La mia spiegazione

Penso che sia perché i metodi statici appartengono alle classi, non agli oggetti. Ecco perché eclipse ti suggerisce di chiamare il metodo in modo statico usando il nome della classe e non il nome dell'oggetto:

  • Imetodistaticifannosempreriferimentoaltipodidichiarazione.
  • Èlastessaragionepercuicampistatici/membri/attributisonoglistessiperognioggetto,perchéesistonosolounavolta,nellaclassestessa.
  • ChiamandounmetodostaticostaispecificandoaJavachevuoicheilmetodoneltipodidichiarazionesiaeseguito.

Sperochelamiarispostanonsembri Captain Obvious scritta.

    
risposta data 04.10.2014 - 10:05
fonte
2

È è polimorfismo, ma non lo stesso tipo di polimorfismo come quando si sostituiscono i metodi di istanza.

È davvero una domanda sulla terminologia. Un metodo statico con lo stesso nome in una sottoclasse è una forma di polimorfismo ad-hoc , in qualche modo simile all'overload del metodo. La parola overloading (piuttosto che overriding ) viene solitamente utilizzata con il polimorfismo ad-hoc (come in "overloading dell'operatore" che è anche una sorta di polimorfismo ad-hoc). Ma l'override dei metodi di istanza è polimorfismo del sottotipo che è una cosa diversa.

Quando si parla di polimorfismo in OO, si intende generalmente il polimorfismo del sottotipo. Con il polimorfismo ad-hoc, il metodo da chiamare viene risolto staticamente in fase di compilazione. Con il polimorfismo del sottotipo l'implementazione del metodo viene selezionata in fase di esecuzione. Il polimorfismo del sottotipo è fondamentale per l'orientamento degli oggetti mentre il polimorfismo ad-hoc è più comodo.

    
risposta data 25.08.2016 - 09:52
fonte
1

Il polimorfismo ha due tipi: polimorfismo statico: ottenuto utilizzando il metodo di overloading in java polimorfismo dinamico: raggiunto utilizzando il metodo di sovrascrittura

La tua domanda riguarda il polimorfismo dinamico. Il polimorfismo dinamico è correlato all'ereditarietà. Consideriamo l'esempio in cui la classe secondaria ClassB sovrascrive un metodo chiamato metodoA presente nella classe padre ClassA.

durante la scrittura di questo codice: %codice% Il polimorfismo dinamico in java indica che qui si verifica un legame dinamico e verrà chiamato il metodo methodA definito nella classe B.

I metodi statici appartengono alla classe e non ai singoli oggetti. Quando si definisce un metodo statico nella classe figlia, questo metodo non ha alcuna relazione con il metodo genitore. È considerato come un nuovo metodo. Puoi dare un'occhiata a questi tutorial per maggiori informazioni su override del metodo e polimorfismo .

    
risposta data 25.08.2016 - 03:33
fonte

Leggi altre domande sui tag