[英]Why do I get a compilation error when I try to have two methods with the same name and parameter type?
如果我將byte
更改為int
我得到編譯器錯誤。 你能解釋一下這個問題嗎?
public class A {
protected int xy(int x) { return 0; }
}
class B extends A {
protected long xy(int x) { return 0; } //this gives compilor error
//protected long xy(byte x) { return 0; } // this works fine
}
如果我將
byte
更改為int
我得到編譯器錯誤。
如果你這樣做,你有這個:
public class A {
protected int xy(int x) { return 0; }
}
class B extends A {
protected long xy(int x) { return 0; }
}
...而xy
方法的唯一區別是它們的返回類型。 方法不能僅通過它們的返回類型來區分,這就是Java的定義方式。 考慮一下:
myInstance.xy(1);
應該撥打哪個xy
? long xy(int x)
或int xy(int x)
?
如果您的目標是覆蓋 B
xy
,那么您需要使其返回類型為int
以匹配A#xy
。
雖然方法分別放在同一繼承樹中的不同類中,但是在類中不能有兩個具有相同簽名的方法。 即基類和子類
注意:只是返回類型不能使編譯器理解方法的區別。 返回類型不是包含在方法簽名以及
您正在嘗試使用相同的名稱和輸入參數編寫兩個方法,這是不可能的。
請看以下兩種方法:
float met(){
return 4.5;
}
double met(){
return 5.4;
}
如果我們寫這條線的話
int x = (int)met();
會叫什么方法?
無法決定,因此不允許這種情況。
那是因為如果你將byte更改為int你將在base和sub類中使用相同簽名的方法(相同的方法名和參數類型),因此返回類型也應該相同。 因為不是(int和long)它會給你錯誤
您可以僅通過參數和名稱區分方法。
both methods are in same class B
b.xy(byte x) or b.xy(int x) is called for input xy(0) or xy(1)
重寫方法應該返回一個類型,該類型可以替換overriden方法返回的類型
因為當您將byte
更改為int
,調用該方法的實例不知道該方法的含義。 被覆蓋的還是舊的?
這就是為什么它不允許具有相同的簽名(方法名稱,參數類型和參數數量)。 就像信息一樣:返回類型不是簽名的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.