子类继承接口吗?

2022-09-01 02:42:23

小问题,我正在学习接口和继承。

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


答案 1

如果您有:

abstract class StaffMember implements MyInterface

哪里

interface MyInterface {
    void myMethod();
} 

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

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

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


答案 2

不。

接口定义类的外观(作为最低限度)。是在基类中还是在最低子类中实现此功能并不重要。

接口必须在整个子类和基类的层次结构中完全实现,并且必须在接口实现签名所在的级别定义()。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()SubClasstest2()BaseClassabstract

正如您在方法中看到的那样,将对象定义为 或 都有效并且没有区别。mainBaseClassSomeInterface


推荐