我正在經歷繼承規則。我碰到下面規則繼承規則 - 覆蓋方法的返回類型可以是覆蓋方法中聲明的返回類型的子類
重寫方法的返回類型可以是在重寫方法中聲明的返回類型的子類。
我不明白它背後的目的。 如果有人能解釋它。
我正在經歷繼承規則。我碰到下面規則繼承規則 - 覆蓋方法的返回類型可以是覆蓋方法中聲明的返回類型的子類
重寫方法的返回類型可以是在重寫方法中聲明的返回類型的子類。
我不明白它背後的目的。 如果有人能解釋它。
它允許您在使用特定的子類時使用更具體的返回類型。當重寫clone()
方法時,一個常見的例子是使用更具體的返回類型。它的聲明像
protected native Object clone() throws CloneNotSupportedException;
所以它返回Object
。但是,在您的特定類別(比如,MyObject
),你可以重新克隆這樣的:
public MyObject clone() {
try {
return (MyObject)super.clone();
}
catch(CloneNotSupportedException ex) {
throw new InternalError();
}
}
這樣,用戶的MyObject
類可以調用clone()
方法,並獲得MyObject
結果而無需額外的鑄造。這很方便。
好的,這是我認爲會發生的事情。
比方說,你有以下幾種:
public class Animal {
...
public Animal anotherAnimal() {
return new Animal();
}
}
public class Dog extends Animal {
...
public Dog anotherAnimal() {
return new Dog();
}
}
所以這裏發生了什麼是我們覆蓋的超類方法anotherAnimal
,而規則是在子類(狗),我們被允許返回與超類的方法不同的對象,但它必須返回一個子類的對象。
換句話說,因爲Dog
是Animal
的一個子類,我們可以在覆蓋的Dog
方法中返回它。
另請注意*您無法降低重寫方法*的可見性。即,孩子的*覆蓋*方法永遠不會*私人* – TheLostMind
我知道它,但它背後的邏輯目的,爲什麼它已經以這種方式實現 – arjun
很好的例子。當super.clone()返回一個Object類型時,如何將'super.clone()'向下轉換爲輸入'MyObject'?換句話說,你怎麼能夠下注一個對象來輸入MyObject? – rb612
@ rb612 - 你總是可以做*明確的類型轉換*/*向下轉換*。你的代碼將被編譯。但是,如果類型*不兼容*,則在*運行時*中,您將得到'ClassCastException' – TheLostMind
As [documentation](https://docs.oracle.com/javase/8/docs/api/java/lang /Object.html#clone--)表示,'super.clone()'調用創建當前對象的新實例,無論它是什麼。它是本地JVM代碼,JVM知道如何做到這一點。因此,您可以安全地將其轉換到當前課程。 –