2013-03-08 93 views
8

如果我有在Java中,下面的代碼:這是重載,在不同的類和不同的簽名具有相同名稱的方法?

class A { 

    public int add(int a , int b) { 
     return (a+b); 
    } 
} 

class B extends A { 
    public float add(float a , float b) { 
     return (a+b); 
} 

在子類是不完全重寫基類的add功能,因爲它們有不同的簽名和發生超載的概念只有在這種特殊情況下,他們在相同的範圍內。那麼,子類B中的函數add(float , float)是否被視爲一個全新的函數,並且重載和覆蓋的概念不適用於它?它使用「靜態綁定」還是「動態綁定」?

+2

只是一個提示:Java中的類名應該以大寫字母開頭。 – 2013-03-08 10:10:39

+0

我不認爲這是強制性的.. – 2013-03-08 10:13:23

+0

這不是強制性的,但它有助於可讀性等 – 2013-03-08 10:14:13

回答

2

簡單地說,是的。要覆蓋,您需要複製完整的方法簽名,其中包括方法名稱,參數和返回類型。從the tutorial

在具有相同簽名(名稱,加上 數量及其參數的類型)的子類的實例方法,並作爲超的 實例方法重寫父類的方法返回類型。

您可能想要考慮@Override annotation,如果您未成功覆蓋方法,將觸發編譯器錯誤。

在這種特定情況下,它也許看起來像你不需要覆蓋這麼多的一些解決方案,包括仿製藥。所以,你可以實例化一個類a<Integer>和同級a<Float>

+0

所以你在說b中的add(float,float)是一個完全不同的函數,並且與class a中的add函數沒有任何關係。在這種情況下,超載也不會超越。 – 2013-03-08 10:23:20

+0

也許吧。你不是壓倒性的,你提供了一個不同的類,其中有一個重載的方法和原來的一樣,所以在這裏更適合使用泛型解決方案。 – 2013-03-08 10:58:30

4

方法B類補充說明的是加在課堂上的超載。不是覆蓋。重寫只是原始添加方法的不同實現。

+0

但是我知道Overloading的概念只有當函數是在相同的範圍或類別中。這就是造成混淆的原因 – 2013-03-08 10:18:44

2

在這種情況下,您不是覆蓋該方法,因爲簽名是不同的。

但有超載在B級,因爲你有兩種方法具有相同的名稱但不同的參數(如果其中一個類,而另一個在B級)

希望它能幫助。

+0

但是我知道只有當函數處於相同的範圍或類中時,Overloading的概念才起作用。這是造成混亂的原因。 – 2013-03-08 10:17:49

1

可以有未覆蓋,但在子類重載的方法。這裏的子類有兩個add()方法。接受int參數(未重寫)的版本和接受float參數的重載方法add()。

-1

在類A中的方法add()也通過繼承提供給類B,因此該方法通過改變數據類型從int, intfloat, float類是overloaded

+0

我想這並不能真正回答這個問題。提問者知道超載和重寫。 – 2015-09-11 16:32:01

0

我認爲在這種特殊情況下既不超載也不是壓倒一切的發生,是因爲返回類型必須是在超載的情況下壓倒一切一樣,所以沒有靜態綁定,也不動態綁定發生在這種情況下。 在不同的返回類型的情況下,方法重載是不可能的,因爲編譯器無法確定他需要調用哪種方法。

-1

超載的概念來自於遊戲,當且僅當函數是在同一個範圍或類。 cz如果這是方法重載的情況,那麼對於相同的方法簽名或相同的參數類型,編譯器會感到困惑,並且必須給出編譯時錯誤。 但在上面的B類程序中,如果你按照相同的順序傳遞相同的參數,那麼根據重載它必須給出錯誤,但它不會發生,你可以檢查它,我已經有了。 這是繼承的情況,通過對象引用,如果你調用任何方法,那麼編譯器會在子類中檢查它,如果它不存在,那麼它會查看父類,以上程序是關於。 希望這是有幫助的。

+0

請處理大小寫和標點符號。這個答案很難理解 – lwassink 2016-07-13 18:42:10

相關問題