2015-05-06 31 views

回答

1

它允許您在使用特定的子類時使用更具體的返回類型。當重寫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結果而無需額外的鑄造。這很方便。

+0

很好的例子。當super.clone()返回一個Object類型時,如何將'super.clone()'向下轉換爲輸入'MyObject'?換句話說,你怎麼能夠下注一個對象來輸入MyObject? – rb612

+1

@ rb612 - 你總是可以做*明確的類型轉換*/*向下轉換*。你的代碼將被編譯。但是,如果類型*不兼容*,則在*運行時*中,您將得到'ClassCastException' – TheLostMind

+1

As [documentation](https://docs.oracle.com/javase/8/docs/api/java/lang /Object.html#clone--)表示,'super.clone()'調用創建當前對象的新實例,無論它是什麼。它是本地JVM代碼,JVM知道如何做到這一點。因此,您可以安全地將其轉換到當前課程。 –

0

好的,這是我認爲會發生的事情。

比方說,你有以下幾種:

public class Animal { 
... 
    public Animal anotherAnimal() { 
     return new Animal(); 
    } 
} 

public class Dog extends Animal { 
... 
    public Dog anotherAnimal() { 
     return new Dog(); 
    } 
} 

所以這裏發生了什麼是我們覆蓋的超類方法anotherAnimal,而規則是在子類(狗),我們被允許返回與超類的方法不同的對象,但它必須返回一個子類的對象。

換句話說,因爲DogAnimal的一個子類,我們可以在覆蓋的Dog方法中返回它。

+1

另請注意*您無法降低重寫方法*的可見性。即,孩子的*覆蓋*方法永遠不會*私人* – TheLostMind

+0

我知道它,但它背後的邏輯目的,爲什麼它已經以這種方式實現 – arjun