2015-09-24 13 views
1

如果一個類阿爾法已經與參數的方法作爲public void foo(String... args) &相同的方法試圖通過發言權創建public void foo(String a)。而參考對象&實例化以子類貝塔&試圖從阿爾法訪問FOO方法在子類中貝塔被覆蓋。它從Alpha類返回值,而不是從Beta子類中返回值。(String ... args)的值如何影響子類重寫?

不應該從BETA類返回值,因爲它的初始化爲&分配了Beta類Object?

有什麼區別黑白Method(String ... args) & Method(String a)

+4

顯示您的代碼。 –

+0

並閱讀https://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html –

+2

爲什麼你會認爲'foo(String ...)'可以被'foo(字符串)'? – RealSkeptic

回答

2

這是因爲Beta的方法而不是重寫Alpha中的一個,因爲它沒有相同的形式參數。 String...String不一樣,很像String[]String不一樣。

+0

參數也應該是相同的,我的理解是重寫是基於方法名稱而不是參數。 – suni

+0

請參閱https://docs.oracle.com/javase/tutorial/java/IandI/override.html。是的,參數應該是一樣的。 – manouti

1

一個參數爲String的參數爲而不是的方法重寫了一個參數爲String...的參數。參數類型String...是一個變量arity方法,這意味着可以傳遞0個或更多參數,例如, foo("one", "two", "three")。在該方法的主體中,它被視爲一個數組,而不是一個String。如果您在Betafoo聲明中使用了@Override,編譯器會發現您沒有覆蓋foo。相反,您已超載foo

要覆蓋某個方法,必須使參數和方法的名稱完全匹配。事實上,即使參數都被視爲數組,因爲調用該方法的方式,您甚至不能將其類型設置爲String[]

  • 相同方法簽名作爲父類的方法

方法重載時出現超過1:當一個子類嘗試實現與方法

1

方法覆蓋發生方法使用相同的方法名稱,但具有不同的方法簽名。 (方法重載可以在同一類內發生,即不需要子類)

方法簽名包括

  • 方法名稱
  • 方法參數列表

不包括

  • 方法的返回類型
  • 訪問修飾符(公共/保護/私營)
  • 其他改性劑(最終/靜態/等。)

證明

實際上,你可以很方便地測試你自己問:

class Parent{ 
    public void doWork(String s1, String s2){ 
     System.out.println("From Parent"); 
    } 
} 

class Child extends Parent{ 
    @Override //<-This will tell you whether it successfully overridden or not 
    public void doWork(String s1){ 
     System.out.println("From Child"); 
    } 
} 

輸出?

這將是一個錯誤。因爲您正在告訴子級類,以覆蓋Parent的方法doWork(String)。但是,在父類中找不到這種方法。 類只有一種方法稱爲doWork(String, String)

結論: 回答你的問題是沒有,它會不會被覆蓋因爲從子類中的方法是有與父類的方法,不同的方法簽名。

+0

@suni如果你已經清除你的疑惑,你可以通過點擊答案旁邊的空白勾來接受其中的一個解決方案。你得到2代表回報。 – user3437460

相關問題