簡體   English   中英

當我嘗試使用具有相同名稱和參數類型的兩個方法時,為什么會出現編譯錯誤?

[英]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.

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