[英]What happens when a method is overridden in Java?
當 Java 中的預定義方法被覆蓋時...
答案是什么? 1 或 2
我知道當我們重寫超類中的方法時,方法簽名應該是相同的。 但是遺產呢? 我在一本書上讀過這個問題,但即使經過一些研究,我也沒有找到任何答案。
從文檔:
子類中的實例方法具有與超類中的實例方法相同的簽名(名稱,加上其參數的數量和類型)和返回類型,將覆蓋超類的方法。
方法簽名必須相同; 即名稱、參數、參數位置、參數個數必須匹配。
最常見的例子是toString()
,它存在於Object
。 Object
的toString
方法定義如下:
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
東西,例如ArrayList
和LinkedList
。
擴展一點:方法在孩子中的可見性也起作用。
從這個方便的圖表中,不能將具有private
修飾符的方法傳遞給子類。
覆蓋方法時,不能降低方法的可見性; 也就是說,您不能按照提供的可見性順序下降。
為了提供幫助,這里有一個快速列表。
如果您的父級中的方法是...
public
:子類的覆蓋必須是public
。protected
:子類的覆蓋可以是public
或protected
。<no modifier>
或包私有:子類的覆蓋可以是public
、 protected
或 package-private 。private
:子類甚至不知道該方法存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.