2010-03-31 161 views
2

傢伙,我知道這個問題是愚蠢的,但只是爲了確保:
有我的類方法:覆蓋或重載?

boolean equals(Document d) 
{ 
//do something 
} 

我超載這種方法也不是壓倒一切的吧?我知道這個或類似的問題將出現在即將到來的egzam上,並且會因爲這樣一個簡單的錯誤而不能得分;

回答

6

你甚至沒有超載,因爲另一種方法叫做equals。但是,如果您添加s,則會超載equals。儘管如此,如果兩個(或多個)具有相同名稱但簽名不同的方法在相同類別中定義爲,我們將討論超載。在你的情況下,這是棘手的,因爲你的equals與其不同的簽名部分隱藏原來的equals。這通常是一件壞事,因爲這幾乎總會導致難以理解的行爲,從而導致微妙的錯誤。每當有人在你的類的實例上調用equals時,根據參數類型的不同,調用可能會轉到該方法的不同實現。

class Document { 
    public boolean equals(Document d) 
    { 
    //do something 
    } 
} 

Document doc1 = new Document(); 
Document doc2 = new Document(); 
String string = new String(); 

doc1.equals(doc2); // calls Document.equals 
doc1.equals(string); // calls Object.equals! 

你會被重寫Object.equals如果你使用完全相同的簽名與原始定義你的方法,即

public boolean equals(Object obj) ... 

在這種情況下,上述兩種調用equals的正確執行Document.equals

9

根據提供的代碼,我們無法確定確定您是否重載或覆蓋它。

你很有可能超載equals(Object o)方法。

class A { 
    void method() {..} 
} 

class B extends A { 
    // this is overriding 
    void method() {..} 
} 

而且

// this is overloading 
class A { 
    void method(boolean b) {..} 
    void method(String arg) {..} 
    void method(int arg) {..} 
} 

附:您正在使用在java世界中未被廣泛接受的括號約定。在Java中,更常見的是將大括號打開。

1

從您發佈的代碼中可以找到它。如果equal在具有相同參數聲明的超類中定義,則重寫它。如果已經有一種稱爲equal的方法,但是具有不同的參數類型,則將其重載。

0

在相關說明中,如果您使用的是Java 5及更高版本,並且您的意圖是重寫,那麼強烈建議在方法定義之前使用@Override註釋來表示您的意圖。這個註解的錯誤用法(即當你想重寫並且不這樣做時)會標記一個編譯錯誤。

從Java 6開始,您可以使用@Override註釋,同時定義在接口中聲明的方法 。

-1

重載:相同的方法名稱,相同的參數列表,不同的類 覆蓋:相同的方法名稱,不同的參數列表,相同或不同的類。

Class A { 

    bool Equals(Document d) {...} 

    bool Equals(A a) {...} // overloaded method 
} 

Class B extends A { 
    bool Equals(Document d) {...} // overridden method 

    bool Equals(B b) {...} // overloaded method 
} 

有一點要注意,返回類型並不重要,它的方法和參數列表,使所有的差異的名稱。

+0

@Tyanna「重載:相同的方法名稱,相同的參數列表,不同的類別覆蓋:相同的方法名稱,不同的參數列表,相同或不同的類別。 - 這不是真的 – 2010-04-02 16:00:22

+0

非常抱歉。我把它們弄倒了。 – Tyanna 2010-04-07 18:42:42