快速提问,我正在学习接口和继承。
这不是实际代码,只是一个例子。假设我有抽象类Animal。 有一些遗产,如马和犬类。还有一个界面“宠物”。它将用于Animal的不同子类。犬“狗”的子类实现了“宠物”界面。因此,“Dog”的所有子类也实现了“Pet”接口,而不必在“Dog”的每个子类上单独实现“Pets”,对吗?
答案 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
方法中所看到的那样,将对象定义为BaseClass
或SomeInterface
都有效并且无效。