2011-07-20 153 views
1

我有一個接口BaseModel錯誤繼承

public interface BaseModel 
{ 
    String toString(); 
} 

和抽象類BaseData

public abstract class BaseData 
{ 
    public abstract String toString(); 
} 

我希望我的模型類重寫toString()方法。爲此,我嘗試了以下方法,一次一個,卻不能在一起:

  1. 讓我所有的模型類實現interface BaseModel

  2. 讓我所有的模型類實現abstract class BaseData

在第一種情況下,如果我不覆蓋模型類中的toString()方法,則不會收到編譯錯誤。我想這是考慮Object.toString()方法作爲有效的實現。

但在我的第二種情況下,如果我不重寫toString()方法,我得到一個編譯錯誤:

The type Title must implement the inherited abstract method BaseData.toString()

其中Title是延伸BaseData但不會覆蓋toString()我的模型類之一。

爲什麼有差異?

在此先感謝。

回答

2

當您從界面調用toString時,JVM將在您的Title類及其所有擴展類中搜索toString方法。例如。繼續搜索,直到它到達tree = Object類的結尾。

     Object.class - found toString 
          | 
Interface.class --- Title.class - can't find toString 

在java中,你只能擴展1個類。所以你的抽象類擴展Object.class並重寫toString方法。 Sincs Title擴展了你的抽象類,它不能自己擴展Object.class。

Object.class 
    | 
Abstract.class - overrides toString 
    | 
Title.class - has to override toString as it is abstract 
+0

這是一個很棒的答案!非常感謝!而且,真棒格式! –

2

如果你在一個接口中指定一個方法,你將需要在從接口繼承的任何類中實現它。 (不過我不確定爲什麼你沒有得到這裏編譯錯誤 - 這可能是像你說的,因爲它是用Object.toString(),但不要引用我這

對於抽象類,任何標記爲抽象的東西都必須在繼承它的類上實現。

的例外是,如果你有抽象類其中有一個子類(這也是抽象的)一個有一個子類ÇB不需要實現toString方法只要C實現它。

+1

然後B也需要是抽象的。 – user802421

+0

謝謝@ user802421,我編輯了我的答案以包含此內容。 – luketorjussen

1

因爲你的繼承類是具體的。在這種情況下,它必須實現所有在它實現的接口中聲明的abstrct方法以及它所擴展的抽象類。

所以,只需在您的課堂上實施此方法或將其標記爲抽象,如果您的意思是它應該是抽象的。

0

每個對象都有toString()方法,所以如果你實現了BaseModel,它已經完成了接口契約。但是你專門使這個方法抽象,所以每個子類都必須重新實現它。

1

在案例1中,您定義了一個新的接口(使用toString()),然後實現它。正如你推論的那樣,因爲你的對象擴展了Object和Object也定義了toString(),任何Object子類都將符合你的接口。

在案例2中,您使用抽象的toString()方法定義了一個抽象類,該方法隱藏了超類(Object)方法。在這種情況下,BaseData的子類需要定義新的抽象toString()方法的實現。