我有一个接口 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的子类型,因此编译器对此没有任何问题。

09-06 23:54