2011-07-20 123 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()方法的实现。