当我们在类中实现接口时,我们需要确保该接口定义的所有方法都出现在类的源代码中.那么为什么这段代码很容易编译?
interface A {
void f();
}
class X {
public void f() {}
}
class Y extends X implements A {
}
Run Code Online (Sandbox Code Playgroud)
因为X已经实现了f()方法,Y扩展X,这使得它继承了所述方法的实现.
对于这种情况,分辨率通过方法签名进行.而且X即使没有实现A接口,该类也有一个具有正确签名的方法.所以实现类,Y也有那个方法.
我会说,只有当没有办法让类X同时实现接口(外部库,代码冻结,坏老板等)时,才应该使用这样的构造 - 虽然有效 - 因为它让人头疼发生了什么......一读完代码,必须导航到课堂X,并在f()那里找到方法......
首先,我误读了这个问题,这些问题在X implements A出现时也是有效的.
即使您已经明确地指定了该X implements A子句,但这并不重要 - 在这种情况下,这是多余的.
如果X是抽象的,并且Y没有实现f(),Y将被强制实现该方法,除非Y被声明为抽象.