子类是否继承接口?

mun*_*air 34 java polymorphism

快速问题,我正在学习接口和继承.

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

csv*_*van 17

如果你有:

abstract class StaffMember implements MyInterface
Run Code Online (Sandbox Code Playgroud)

哪里

interface MyInterface {
    void myMethod();
} 
Run Code Online (Sandbox Code Playgroud)

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

void otherMethod(MyInterface param) { //... }
Run Code Online (Sandbox Code Playgroud)

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

  • 它们有很多,很多(很多!):)接口是有效Java设计策略中非常重要的一部分,即使它们最初看起来很可疑. (2认同)

Jer*_*vel 11

没有.

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

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

}   
Run Code Online (Sandbox Code Playgroud)

}

输出:

[]
[interface SomeInterface]
[]
[interface SomeInterface]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样test()(它实现的SubClass)不会返回任何实现的接口,而test2()(实现中BaseClass)确实显示该接口是由该类实现的.抽象类可以允许从它们实现的接口实现方法,通过将定义标记为子类来实现abstract.

正如您在main方法中所看到的,将对象定义为BaseClassSomeInterface工作并没有任何区别.