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.
fonte
2014-12-06 17:05:05
Ridefinizione. L'override funziona solo con i metodi di istanza ereditati. – helpermethod
Che cos'è la "ridefinizione"? Definiscilo o fornisci un link per portarci sulla stessa pagina. –