我有一个接口 IfcBase ,它由另一个类 Base 实现。此类由第二类子基础进一步扩展。进一步的SubBase类实现了另一个接口 IfcNew 。这两个接口都声明了具有相同签名的方法。现在,SubBase不再从IfcNew定义方法。现在,我创建一个SubBase实例,并将其分配给引用类型IfcNew。然后,我调用lone方法并获得输出。在这种情况下,将执行IfcBase中的方法。我认为在编译或执行期间的某个阶段都不应允许这样做。我无法理解该行为并寻求帮助。来源如下。非常感谢!
public interface IfcBase
{
public void printString();
}
public class Base implements IfcBase
{
public void printString()
{
System.out.println("Base Class");
}
}
public interface IfcNew
{
public void printString();
}
public class SubBase extends Base implements IfcNew
{
//
}
public class Test
{
public static void main(String[] args)
{
IfcNew i = new SubBase();
i.printString(); //Output:Base Class
}
}
最佳答案
这就是继承在Java中的工作方式。
您有一个在public void printString()
中实现的名为Base
的方法,从中可以扩展SubBase
。结果,该实现将在此类中隐式可用。
对于implements IfcNew
声明中的SubBase
部分,编译器将仅检查SubBase
是否实现了与public void printString()
签名相同的方法。由于它隐式继承了Base
的实现,因此没有什么可抱怨的。
如果从OO设计的角度来看,这种行为很容易理解。请看看我几年前写的this article。在“方法签名,对象接口,类型,子类型和超类型”部分下查看。根据此处提供的subtype
的定义,SubBase
已经是IfcNew
的子类型,因此编译器对此没有任何问题。