簡體   English   中英

在java中覆蓋和隱藏有什么區別?

[英]What's the difference between override and hidden in java?

我搜索了很多。 它們之間的區別在於,override是針對實例方法的,而hidden是針對靜態方法的。 隱藏實際上是對方法的重新定義。 但是我仍然沒有得到它。如果重新定義意味着父類的靜態方法仍然存在於子類中,那只是我們看不到它? 或者為什么我們把它稱為隱藏而不是任何其他詞? 但如果它存在,我找不到再次調用該方法的方法。 說實話,從功能層面來說,我找不到它們為什么不同。 有人可以從更深層次的內存中解釋它嗎?

JLS 8.4.8.2開始 ,示例8.4.8.2-1向我們顯示隱藏方法綁定到引用的類型( Super ),而overriden方法綁定到Object( Sub )的類型。

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + ", " + s.name());
    }
}

輸出:

Goodnight, Dick

靜態成員(方法和變量)將不會出現在繼承它們的子類(子類)對象中,但它們將作為單個副本存在於內存中。

靜態成員可以通過Super類和子類的類名訪問,但它們實際上不存在於這些類的對象中。

在繼承非靜態成員的情況下,內存中的Sub類對象將包含繼承的方法以及它自己的方法。 因此,當您嘗試在此處編寫類似的方法時,將覆蓋超類方法。 另一方面,由於靜態方法不參與繼承,所以您編寫的任何類似方法都存在於超類中,新方法將在每次要求時運行。 父類方法只是隱藏但沒有被覆蓋!

超越基本上支持后期綁定。 因此,將在運行時決定調用哪個方法。它用於非靜態方法。

隱藏適用於所有其他成員(靜態方法,實例成員,靜態成員)。 它基於早期綁定。 更清楚的是,在編譯期間決定要調用或使用的方法或成員。

有關更多詳細信息,請參閱覆蓋Vs隱藏 ,並查看鏈接。

如果調用Superclass.staticMethod()您將獲得超類中定義的方法,而不管子類中是否存在任何隱藏。 另一方面,如果你調用((Superclass)subObj).instanceMethod()你仍然會調用該方法,因為它在子類中被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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