2015-06-15 38 views
-3

當在Java中預定義的方法被覆蓋......在Java中重寫方法時會發生什麼?

  1. 只有方法簽名必須是同一
  2. 兩個方法簽名和繼承必須是同一

答案是什麼? 1或2

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

+3

'方法簽名和繼承必須相同'請解釋。 – Saif

+0

[覆蓋和隱藏方法](https://docs.oracle.com/javase/tutorial/java/IandI/override.html) – MadProgrammer

+0

@Saif我在書中讀到這個。我也有同樣的疑問。如果你有任何想法發佈你的問題 –

回答

1

From the docs

在具有相同簽名(名稱,加上數量和它的參數的類型)的子類的實例的方法和如在超類中的實例方法重寫父類的方法返回類型。

方法簽名必須相同;也就是說,名稱,參數,參數的位置和參數的數量必須匹配。

這最常見的例子是toString(),它生活在ObjectObjecttoString方法被定義爲這樣的:

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


要擴展位:在孩子的方法的知名度也起到了重要作用。

從此handy chart,具有private修飾符的方法不能傳遞給子類。

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

爲了幫助,這裏有一個快速列表。

如果你的父母的方法是...

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

我想這裏的繼承可能是指在預定義的超類中提到的訪問說明符。如果我們擴展該類並嘗試重寫該方法,則不允許通過放置公共訪問說明符(讓超類方法具有私有性)來增加訪問權限。在這種情況下,繼承詞是指它嗎?如果是這樣的話,我的問題就明確了! –

+0

我認爲你在這裏得到了可見性,但我會修改我的答案。 – Makoto

相關問題