2013-04-14 35 views
1

比方說,我們有這個方法方法覆蓋作廢

public class Animal { 
    public void eat() { } 
} 

,並在延伸的動物具有這種方法

public String eat(){} 

這被認爲是爲方法覆蓋另一個類?因爲我聽說,您可以使用方法返回類型不同覆蓋提供它們具有相同的方法參數

+2

這是不可能的。 – Ankit

回答

5

只能更改返回類型以原返回類型的子類。

+0

奇怪,但'String'是Object的子類爲什麼這不正確? – ALZ

+0

OP沒有在父方法中使用Object作爲返回類型,但他寧願使用'void' –

1

這不是正確的代碼,因爲這兩種方法具有相同的名稱應返回相同的值,只有參數可以是型動物 重寫是一種在子類 重載用相同的參數相同的方法具有不同argumens

0

相同的方法名方法的返回類型不是該方法簽名的一部分。

當您在子類上調用eat()時,java會查看您提供的簽名(eat不帶參數),並開始尋找具有此簽名的方法,從您調用該對象的實例類型的類開始(如果找不到它,搜索其祖先)。

所以,叫上一個子類將永遠運行重載方法的方法(他們發現的)。

OO(具體多態性)的一個關鍵「點」是一個子類可以在超類預期被傳遞。 如果一個方法想要調用超類'eat()方法並且獲得一個void,但是你將一個子類傳遞給eat()返回一個String的那個方法;你可以看到該方法會調用子類「吃飯」並獲得意想不到的價值。
你可以看到爲什麼這可能是一個問題。 :我

所以,壓倒一切的方法必須返回一個類型相同或由父返回類型的子類。 (類似的原則適用於爲什麼你可以返回一個子類;我會讓你考慮一下c:)

6

這既不是重載,也不是重寫!這是編譯錯誤。

在Java中,可以定義共享同一名稱的同一類的兩種以上的方法,只要它們的參數聲明是不同的。在這種情況下,這些方法被稱爲超載,並且該過程被稱爲方法重載。

以下是規則方法覆蓋在Java中必須遵循,而重寫任何方法。 私有,靜態和最終方法不能被覆蓋。

1)方法的簽名必須是相同的,包括返回類型的方法的參數數量,參數類型和參數順序。

2)覆蓋方法不能拋出比原來的或重寫的方法更高的異常。此規則僅適用於Java中的checked Exception,重寫的方法可以自由引發任何未經檢查的Exception。

3)重寫方法不能減少重載方法的可訪問性,意思是如果原方法或重寫方法是公共的,而重寫方法不能使其保護。

+0

請注意,我們可以將返回類型更改爲@Timmy提到的原始返回類型的子類。 –

2

從技術的角度來看,所有的答案都是正確的,因爲Void是Java中的一個類,沒有其他類可以擴展,當方法被重寫時,返回類型必須是原始類型的子類型(parentReturnType。 isAsignableFrom(overriddenReturnType))。

但是從實際的角度來看,這個問題仍然是有效的,並且爲特例無效提供藉口是有意義的。 Void類型變量的唯一值可以爲null。此外沒有變量可以具有原始類型void。最後你不能編譯這個代碼: Void result = object.notify(); 所以最後,當1.5引入時,以不同的方式指定Java是有意義的,並允許覆蓋具有任何其他類型的void返回類型。

因此,唯一合理的答案是恕我直言,這是不可能的,因爲Java的設計,這是不允許的。