簡體   English   中英

Java中的繼承不符合我的預期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM