2013-04-23 39 views
2

據的Javadoc訂單 - 重寫

在具有相同簽名(名稱,加上 的數量和它的參數的類型)的子類的實例方法和返回類型以 實例方法超類會覆蓋超類的方法。

我的問題是 - 是參數的順序無關緊要嗎?如果他們有相同的名字,他們也是同一類型?

回答

5

該命令很重要,因此具有相同參數不同順序的兩個方法不會被認爲具有相同的簽名。
例如,這個例子不能編譯:然而,

interface Foo { 
    void doIt(String what, int times); 
} 

class Bar implements Foo { 
    public void doIt(int times, String what) {} 
} 

參數的名稱是無關緊要的。這是非常好的:

interface Foo { 
    void doIt(String what, int times); 
} 

class Bar implements Foo { 
    public void doIt(String andNowForSomeThingCompetelyDifferent, int theLarch) {} 
} 
0

訂單很重要。如果訂單不同,簽名是不同的。 public void foo(int x, Object y) 不能 public void foo(Object y, int x)

1

訂單也必須重寫同其他壓倒一切就不會發生

2

Java Language Specification說的順序是物質的,但它需要一些嘲弄出來解釋爲什麼:

8.4.1。形式參數

方法或構造函數的形式參數(如果有)由逗號分隔參數說明符列表指定。

...

8.4.2。方法簽名

兩個方法或構造函數聲明M和N具有相同的參數類型,如果所有的下列條件成立:

  1. 他們有相同數量的形式參數(可能是零)
  2. 他們的相同數量的類型參數(可能爲零)
  3. 設A ,...,A ñ是M的類型參數,並讓乙,...,B n是N的類型參數。在將N的類型中的每個出現重命名爲A i後,相應類型變量的邊界是相同的,並且M和N的形式參數類型是相同。

...

兩種方法簽名M1和M2是倍率相當於當且僅當任一m1是2或m 2的子簽名是M1的子簽名。

形式參數被指定爲一個列表,因此對於「M和N的形式參數類型」是相同的,它們必須是相同的列表,並且列表是依賴於順序的。

由於3中的對應關係依賴於順序,因此類型參數的順序也很重要。

當您處理Method Descriptors的字節碼/ JNI約定時,這會變得更加明顯。

MethodDescriptor: 
    (ParameterDescriptor*) ReturnDescriptor 
1

沒有,訂單事宜!

規則在Java

規則1)重載方法的方法是說,如果延伸另一個類的類定義具有相同的名稱和參數列表的方法被重寫。

規則2)基類中定義的方法應該在派生類中可見。如果不是這樣,派生類中的方法將不會被視爲被覆蓋的版本,而會被視爲一種常規方法。

規則3)方法名和參數列表對於覆蓋和重寫的方法應該是相同的。但是返回類型可以是不同的。這意味着如果超類中方法的返回類型爲 Map,那麼同一個方法的返回類型可以是HashMap。

規則4)重寫方法(在派生類中)中的訪問說明符不應該比overriden方法(在基類中)更受限制。這意味着如果基類方法的訪問說明符被保護,那麼派生類方法的訪問說明符不應該是默認的或私有的,但可以被保護,公開。增加各種符的可見性的順序是:

私有的,默認情況下,保護公衆

第5條)在派生類的方法中規定的例外情況應該是相同或子類它們。因此,如果基類方法在throws子句中將異常指定爲IOException,那麼派生類方法可以將異常指定爲FileNotFoundException,IOException但不是Exception。

0

如果順序不一樣,編譯器將無法找到該方法,並且您將收到一個錯誤,如同這樣