簡體   English   中英

在 Java 中重寫方法時會發生什么?

[英]What happens when a method is overridden in Java?

當 Java 中的預定義方法被覆蓋時...

  1. 只有方法簽名必須相同
  2. 方法簽名和繼承必須相同

答案是什么? 1 或 2

我知道當我們重寫超類中的方法時,方法簽名應該是相同的。 但是遺產呢? 我在一本書上讀過這個問題,但即使經過一些研究,我也沒有找到任何答案。

從文檔

子類中的實例方法具有與超類中的實例方法相同的簽名(名稱,加上其參數的數量和類型)和返回類型,將覆蓋超類的方法。

方法簽名必須相同; 即名稱、參數、參數位置、參數個數必須匹配。

最常見的例子是toString() ,它存在於Object ObjecttoString方法定義如下:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

...而AbstractCollection * 的toString方法定義如下:

public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' ');
    }
}

請注意,這兩個方法簽名是相同的,但它們返回的內容不同。 這是覆蓋的意圖; 您的父類為其定義了特定的行為,這在子類中不一定有意義,因此只需超越該行為並使其適合子類。

*:這用於任何屬於AbstractCollection東西,例如ArrayListLinkedList


擴展一點:方法在孩子中的可見性也起作用。

從這個方便的圖表中,不能將具有private修飾符的方法傳遞給子類。

覆蓋方法時,不能降低方法的可見性; 也就是說,您不能按照提供的可見性順序下降。

為了提供幫助,這里有一個快速列表。

如果您的父級中的方法是...

  • public :子類的覆蓋必須public
  • protected :子類的覆蓋可以是publicprotected
  • <no modifier>或包私有:子類的覆蓋可以是publicprotected或 package-private 。
  • private :子類甚至不知道該方法存在

暫無
暫無

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

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