子类是否继承接口?

时间:2013-12-12 03:54:58

标签: java polymorphism

快速提问,我正在学习接口和继承。

这不是实际代码,只是一个例子。假设我有抽象类Animal。 有一些遗产,如马和犬类。还有一个界面“宠物”。它将用于Animal的不同子类。犬“狗”的子类实现了“宠物”界面。因此,“Dog”的所有子类也实现了“Pet”接口,而不必在“Dog”的每个子类上单独实现“Pets”,对吗?

2 个答案:

答案 0 :(得分:15)

如果你有:

abstract class StaffMember implements MyInterface

,其中

interface MyInterface {
    void myMethod();
} 

然后所有扩展StaffMember的类都将继承MyInterface类型,并且您将能够在代码的其他部分中通过此基类型引用它们,其中MyInterface实例需要作为操作数/参数,例如:

void otherMethod(MyInterface param) { //... }

接口MyInterface的实际实现既可以在抽象类中进行,也可以在扩展抽象类的任何类中进行。重要的是,在这种情况下,myMethod()在继承层次结构中的某处指定,以便JVM可以找到要调用的定义。

答案 1 :(得分:10)

没有

接口定义了类的外观(最低限度)。无论是在基类中还是在最低的子类中实现它都无关紧要。

接口必须在子类和基类的整个层次结构中完全实现,并且必须在接口实现签名所在的级别定义(implements Interface)。

子类本身不了解接口,但它们通过基类隐式连接。

因为我是一个善良的人:

public class Test {
    public static void main(String[] args) {
        BaseClass obj = new SubClass();
        obj.test();
        obj.test2();

        SomeInterface obj2 = new SubClass();
        obj2.test();
        obj2.test2();
    }
}

interface SomeInterface {
    public void test();

    public void test2();
}

abstract class BaseClass implements SomeInterface {
    @Override
    public abstract void test();

    @Override
    public void test2() {
        try {
            System.out.println(Arrays.toString(this.getClass().getMethod("test2", null).getDeclaringClass().getInterfaces()));
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}

class SubClass extends BaseClass {
    @Override
    public void test() {
        try {
            System.out.println(Arrays.toString(this.getClass().getMethod("test", null).getDeclaringClass().getInterfaces()));
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}   

}

输出:

[]
[interface SomeInterface]
[]
[interface SomeInterface]

如您所见,它显示test()(在SubClass中实现)不会返回任何实现的接口,而test2()(在BaseClass中实现)确实显示该类实现了一个接口。抽象类可以通过将定义标记为abstract来允许从它们实现的接口实现方法,以便在子类中实现。

正如您在main方法中所看到的那样,将对象定义为BaseClassSomeInterface都有效并且无效。