[英]inheritance in java does not work the way I expected
我有以下課程:
public class X {
public void A() {
B();
}
private static void B() {
System.out.println("111111111");
}
}
現在,我有以下繼承的類Z:
public class Z extends X {
private static void B() {
System.out.println("22222222");
}
}
現在,如果我願意
Z myClass = new Z();
Z.A();
我會得到:111111111結果。 (此外,eclipse告訴我,從不調用繼承類中的B())。
為什么? 以及如何運行繼承的B方法?
B
方法是靜態的 。 當您調用方法A
它將使用類B
的實現(因為這是方法A
的定義位置)。 類B
不知道類Z
的存在,因此無法調用類Z
的方法。
由於該方法是靜態的,因此從B
繼承時不會覆蓋該方法。 多態僅適用於類的實例。 靜態方法不會玩多態游戲,因此不能被覆蓋。
將方法的訪問修飾符從private static
更改為protected
如果您在派生類中重新定義基類的非靜態和非私有方法,則稱為overriding 。
如果您在派生類中重新定義基類靜態方法,則稱為方法隱藏或方法陰影 。
您已經在示例中完成了隱藏而不是覆蓋。
看看這個SE問題
您正在調用X的繼承A方法,這將調用其私有B方法。
private
方法和屬性不會被繼承。
看來您正在覆蓋類Z中的方法B(),但此處未覆蓋方法B()。 由於B()是靜態的,因此類A和類Z具有自己的方法B()。 所有Static方法和變量的范圍都是類級別而不是對象級別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.