2016-02-25 114 views
0

我想知道如何使用抽象類和接口的區別,這困擾了我一下:Java抽象類聲明throwable - 實現不強制執行它?

假設你有一個抽象類

public abstract class Animal { 
//return the tail lenght of the animal 
public abstract int getTailLength() throws IllegalStateException; 
} 

,承諾該抽象類的實現有一個方法所謂getTailLength()編譯器勢力擴展類@override抽象類並實現他們]像這樣:

public Snake extends Animal(){ 

@override 
public int getTailLength(){ 
    return 10; 
} 
} 

編譯器是罰款與此又在抽象類時我們聲明想要getTailLenght()的實現,我們還提到我們希望它引發異常 - 但是在上面的代碼段中已經省略了。

我是否認爲在接口和'實現'聲明中這樣做是不允許的?

我想,因爲您使用@override註釋了方法,編譯器根本不在乎您做什麼,只要您有一個方法具有您在ADT中強制實施的名稱?它會檢查返回類型,爲什麼它不執行異常?

回答

0

我們不希望該方法總是拋出一個異常(否則我們永遠不會得到一個有意義的結果),我們說「這個方法可能會拋出這個異常」。如果沒有意義,讓子類不拋出異常是完全正確的。

如果您的客戶端代碼知道它正在處理子類,那麼它將不必處理異常,作爲額外的獎勵。

在你的實現中沒有聲明一個throw子句來實現一個聲明一個throw子句的接口方法也是完全不錯的。

+0

在聲明抽象方法可能拋出異常時有任何用處嗎?似乎多餘,如果它可以被忽略或特定於實現。雖然如果抽象方法的契約清楚地表明有一個先決條件,可能會很高興提到實現應該引發異常 – Runecreed