2013-05-13 79 views
3
public class Superclass { 

    void method(Object a){ 
    } 
} 


public class Subclass extends Superclass { 

    void method(String a){ 
    } 
} 

在上面的類,在超類方法具有Object類型的參數而子類具有String類型的參數。字符串是Object的子類。我的問題是,在這種情況下是否覆蓋方法?當方法具有相同名稱但簽名不同時方法是否被覆蓋?

+1

的Java 6起,有一個覆蓋註釋,使鏈接明確。如果你把(AT)覆蓋的子類它會說,它並沒有覆蓋.. – 2013-05-13 09:36:54

回答

4

引起你提出這個問題困惑的最有名的例子包括equals

public class Banana { 
    private final double weight; 
    public boolean equals(Banana that) { return this.weight == that.weight; } 
} 

很多人認爲這是一個有效超越equals,但它實際上只是另一種與Object#equals(Object)無關的方法,不會涉及等於比較。

這是Java的類型系統的已知缺陷之一,所以照顧好得到它的權利。

進一步混淆的問題,您允許專門的返回類型(返回類型是協變):

public abstract class FruitTree { 
    public abstract Object getFruit(); 
} 
public class BananaTree { 
    ... 
    @Override public Banana getFruit() { return this.bananas.iterator().next(); } 
} 

注意方法簽名的概念不包括返回類型。方法簽名是靜態(編譯時)方法解析機制中的關鍵概念,每個簽名都是動態方法調度的獨立點。

7

沒有,其方法重載。因爲它是重寫超類方法和子類方法的方法簽名的方法應該是相同的。通過this博客文章去了解這兩個和他們的詳細區別

+1

+1這是混亂的人們共同來源寫作'布爾等於(MyClass的O);' – 2013-05-13 09:34:09

+2

這可能是值得注意的是你可以用更具體的返回類型覆蓋。當然,泛型也使所有這些都很有趣。 – 2013-05-13 09:36:28

+0

@PeterLawrey是的,我見過很多人犯過這個錯誤很多次。 – codeMan 2013-05-13 09:39:33

相關問題