2013-03-08 125 views
1

有沒有人知道爲什麼重寫過程重寫的方法必須拋出重寫的方法的同一類型(或子類型)的異常,而另一方面,對於構造函數它的工作方式相反(因此,必須拋出同樣的異常或超扔什麼的超類型。 非常感謝提前。異常構造函數與異常Java

+0

這是不正確的。所以這個問題沒有意義。子類構造函數不會覆蓋其超類構造函數。它稱之爲。 – 2013-03-08 17:04:29

回答

4

構造函數沒有覆蓋他們的父類的構造函數,但他們呼叫超類的構造函數,或隱或顯。因此,就像調用其他方法拋出一個Exception的方法一樣,構造函數必須捕獲超類的構造函數拋出的異常, st聲明它會拋出相同的異常(或該異常的超類)。

另一方面,重寫方法必須堅持超類的方法定義。因此,它可以拋出一個更具體的例外,或根本沒有。但它不能拋出更廣泛的例外,因爲這會違反超類的合同。

0

我相信對子類構造函數沒有這樣的限制。他們可以拋出他們關心的任何類型的異常,與超類構造函數拋出的類型無關。顯然,如果他們讓超類構造函數通過一個異常,他們將不得不聲明它或它的超類型,就像使用其他方法一樣。但是,這不是對子類構造函數的具體限制:通過拋出其他類型,您可以輕鬆地捕獲並處理異常。

原因是爲什麼子類中的構造函數沒有「重寫」超類中的構造函數,並且沒有以方式多態使用。這是一個獨立的事物,就像一個名爲Subclass.B()的函數獨立於Superclass.A()

還有你總是知道當你打電話給new Subclass()時,你就調用了這個構造函數。而如果你有一個Superclass的參考,並且打電話給superclass.overriddenMethod(),你不能確定這個類型是什麼。因此,覆蓋該方法的任何子類都不能拋出除超類上聲明的異常以外的任何其他異常,它們可能會更改方法簽名的其餘部分。

0

在構造函數中總是會有一個(可能是隱含的)超級調用。 拋出一個超類Exception也會捕獲這個。

public B() { 
    ... initialize fields declared with X x = ...; 
    ... call super constructor 
    ... body of constructor 
} 

一個最重要的方法但是可以更具體,也爲例外:降低的可能性。