当你扩展一个实现接口的抽象类时,它会使类成为一种接口和抽象吗?

时间:2014-10-12 08:50:38

标签: java

我目前正准备参加我的scjp考试。我知道 IS-A 意味着扩展 HAS-A 意味着拥有另一个对象的实例。但是,如果扩展一个实现另一个接口的抽象类,它是否会使该类成为一种接口和抽象呢?

interface Animal{
    void eat();
    void sleep();
}
 abstract class Duck implements Animal{
    public void eat(){}
    public void sleep(){}
 }
 class Animals extends Duck{
     //dosomething...
 }

类动物IS-A(N)动物和IS-A鸭

动物IS-A(N)动物

类动物IS-A鸭

2 个答案:

答案 0 :(得分:1)

是的,子类将是该接口的一种类型。但是,子类是否是抽象的取决于您是否将其定义为抽象。

在你的例子中(使用没有意义的类名),子类不是抽象的,这意味着它必须实现其抽象超类的所有抽象方法,而不是接口的所有方法已经由抽象超类实现。

答案 1 :(得分:0)

从面向对象设计的角度来看,implements SomeInterfaceextends SomeClass都创建了一个IS-A关系。在这两种情况下,您都要创建类接口的子类型。

的含义是,现在子类也是一个接口,或者它也是抽象的。如果使用关键字interface声明类型,则它只能是接口,如果使用关键字abstract和关键字class声明它,则它只能是抽象类。 / p>

在你的例子中,类动物既是鸭子又是动物。但它不是接口或抽象类。

顺便说一句,选择给你的班级打电话"动物"可能表示您错过了关系的某些内容。子类型总是比其扩展的类型更具体。所以也许如果你打电话的话,马拉德"它会更准确地代表这种关系:野鸭是一种特殊的鸭子,也是一种特殊的动物。它是一种特殊的动物,因为鸭是一种特殊的动物。