子类继承接口吗?
2022-09-01 02:42:23
小问题,我正在学习接口和继承。
这不是实际的代码,只是一个示例。假设我有抽象类动物。像马和犬科动物这样的群体有一些遗传。还有一个界面“宠物”。它将用于动物的不同子类。犬类“狗”的子类实现了接口“Pets”。因此,“Dog”的所有子类也实现了接口“Pet”,而不必在“Dog”的每个子类上单独实现“Pets”,对吧?
小问题,我正在学习接口和继承。
这不是实际的代码,只是一个示例。假设我有抽象类动物。像马和犬科动物这样的群体有一些遗传。还有一个界面“宠物”。它将用于动物的不同子类。犬类“狗”的子类实现了接口“Pets”。因此,“Dog”的所有子类也实现了接口“Pet”,而不必在“Dog”的每个子类上单独实现“Pets”,对吧?
如果您有:
abstract class StaffMember implements MyInterface
哪里
interface MyInterface {
void myMethod();
}
那么所有扩展 StaffMember 的类都将继承 MyInterface 类型,并且您将能够在代码的其他部分中通过此基类型引用它们,其中 MyInterface 实例应为操作数/参数,例如:
void otherMethod(MyInterface param) { //... }
接口 MyInterface 的实际实现可以在抽象类中进行,也可以在扩展抽象类的任何类中进行。重要的是,在这种情况下,myMethod() 是在继承层次结构中的某个位置指定的,以便 JVM 可以找到要调用的定义。
不。
接口定义类的外观(作为最低限度)。是在基类中还是在最低子类中实现此功能并不重要。
接口必须在整个子类和基类的层次结构中完全实现,并且必须在接口实现签名所在的级别定义()。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
BaseClass
SomeInterface