2014-12-20 95 views
0

所以我正在讀這本書,作者說:「靜態成員不參與運行時多態性。不能覆蓋派生類中的靜態成員,但可以重新定義它們。」重新定義派生類中的靜態成員。 Java

這是什麼意思?你能舉個例子嗎?

謝謝。

回答

4

如果您重新定義子類中的靜態成員(方法或變量),則隱藏超類的定義。

public class Super 
{ 
    public static void methodA() 
    { 

    } 
} 

public class Sub extends Super 
{ 
    public static void methodA() 
    { 

    } 
} 

這裏靜態methodA被重新定義的子類,但它不會覆蓋超類的methodA

調用Sub.methodA將調用SubmethodA。如果Sub沒有methodA,則調用Sub.methodA可能會調用SupermethodA

+0

還不確定我明白,對不起。你能舉個例子嗎? – OPK

+0

所以如果上面的方法不是靜態的,那麼它會覆蓋不重新定義,是否正確? – OPK

+1

@ taimeili123是的,如果方法不是靜態的,子類中的方法將覆蓋超類中的方法。 – Eran

0

子類中的變量隱藏了超類中具有相同名稱的變量。

1

如果您在子類中重新定義靜態方法,則其被調用方法隱藏。靜態方法在編譯的時候,而不是運行時間都解決了,你叫他們基於類的就好說:

class A { 
    public static void mymthod() {} 
} 

class B extends A { 
    public static void mymthod() {} 
} 

你叫爲:

A a = new B(); 
a.mymthod();//resolved at compile time and associated with class A (compiler will warn although as static method doesnt necessarily need an object to call) 
+0

原諒我,如果我錯了,但不是重新定義一種方法相同的重寫方法?如果該方法不是靜態的,那麼它被認爲是從你給的例子中覆蓋的? – OPK

+1

是的。但請參閱從直接類的運行時v/s編譯時調用Object v/s調用的上下文。看到這種方法與CLASS配合,而不是對象。一旦定義它的定義,不能改變,因爲它是靜態的。 – SMA

1

您可以看到自己與這個

class A { 

    static int x = 1; 
    int y = 1; 

    int f() { 
     return 1; 
    } 

    static int sf() { 
     return 1; 
    } 
} 

class B extends A { 

    static int x = 2; 
    int y = 2; 

    int f() { 
     return 2; 
    } 

    static int sf() { 
     return 2; 
    } 

} 

public class Test { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     A b = new B(); 
     System.out.println("A.x=" + ((A) b).x); 
     System.out.println("B.x=" + b.x); 
     System.out.println("A.y=" + ((A) b).y); 
     System.out.println("B.y=" + b.y); 
     System.out.println("A.f() = " + ((A) b).f()); 
     System.out.println("B.f() = " + b.f()); 
     System.out.println("A.sf() = " + ((A) b).sf()); 
     System.out.println("B.sf() = " + b.sf()); 

    } 

} 

它pprints:

斧= 1 Bx的= 1 ΔY= 1 通過= 1 AF()= 2 BF()= 2 A.sf()= 1 B.sf()= 1

人們會期望B.sf要被打印爲2但沒有。

同樣的人會期望B.x和B.y打印爲2,但也沒有,因爲字段也不是多態,只有函數。

我不確定這是否有很大的實用價值,人們一定會在做完一個錯誤後得知它。 雖然這可能會在更糟的求職面試中被問到。

相關問題