"重寫"只能適用於實例方法.不能用於靜態方法.對於靜態方法,只能隱藏(形式上被重寫了,但是不符合的多態的特性),“重寫”是用來實現多態性的,只有實例方法是可以實現多態,而靜態方法無法實現多態。例如:
Employee man = new Manager();
man.test();
實例化的這個對象中,聲明的man變量是Employee類的,變量名存在棧中,而內存堆中爲對象申請的空間卻是按照Manager類來的,就是Employee類型的man變量的指針指向了一個Manager類的對象。如果對這個man調用方法,調用的是誰的?如果是非靜態方法,編譯時編譯器以爲是要調用Employee類的,可是實際運行時,解釋器就從堆上開工了,實際上是從Manager類的那個對象上走的,所以調用的方法實際上是Manager類的方法。有這種結果關鍵在於man實際上指向了Manager類對象。現在用man來調用靜態方法,實際上此時是Employee類在調用靜態方法,Employee類本身肯定不會指向Manager類的對象,那麼最終調用的是Employee類的方法。
由此,只能說形式上靜態方法的卻可以被重寫,實際上達不到重寫的效果,從多態的角度可以認爲子類實際上是寫了一個新方法,從這個角度上說靜態方法無法被重寫。那麼也就證明了重寫和覆蓋就是一回事。
例如:
public class TestStaticMethodExtends {
public static void main(String[] args) {
A a = new B();
a.p();
}
}
class A {
public static void p() {
System.out.println("基類");
}
}
class B extends A {
public static void p() {
System.out.println("子類");
}
}
輸出:基類