任何人都可以解释构造函数,继承和运行时多态是如何工作的吗?还解释了下面输出背后的逻辑

问题描述 投票:0回答:2

我理解输出背后的原因是运行时多态性。但我无法弄清楚如何?请解释运行时多态,构造函数和继承是如何相关的。

这是JAVA代码。我有理解运行时多态性,但我没有弄明白。

包df;

A1级{

A1(){
    System.out.println("Constructor A() called"); 
}
void m1() { 
    System.out.println("Inside A's m1 method"); 
} 

}

B2级扩展A1 {

B2(){
    System.out.println("Constructor B() called"); 
}

void m1() { 
    System.out.println("Inside B's m1 method"); 
} 

}

C3类扩展A1 {

C3(){
    System.out.println("Constructor C()"); 
}
void m1() { 
    System.out.println("Inside C's m1 method"); 
} 

}

公共类Cldf {

// object of type A 
public static void main(String[] args) {
    A1 a = new B2(); 

}

}

我期望结果如下

构造函数B()调用。

但结果是

构造函数A()调用了构造函数B()

java constructor polymorphism
2个回答
0
投票

默认情况下,super()在继承时从子类调用。这是由编译器完成的。

这样做是因为如果超类初始化其构造函数中的任何私有变量,则需要对其进行初始化。话虽如此,但并不意味着创建了2个对象。仅创建子类的一个实例。

在您的情况下,B2构造函数默认调用A1构造函数。

尝试在下面执行,您将遇到编译错误。

Class A1{
    public A1(String msg){
    }
}

Class B2 extends A1{
    public B2(){
    }
}

0
投票

当初始化该类的对象时,将调用类的构造方法。在您的示例中,B2扩展了A1类。当创建B2对象时,调用B2()构造函数。理想情况下,您必须在B2构造函数中调用超级构造函数

    B2(){
        super();
        System.out.println("Constructor B() called"); 
    }

因此,当在对象创建期间调用B2()时,它将调用其超类构造函数。如果默认情况下没有实现,java编译器将调用超类构造函数。因此,您的结果调用了构造函数A(),然后调用了构造函数B()。在下面的例子中,引用是父类,而object是子类。 A1 a = new B2();由于对象是B2,因此调用构造函数B2(),默认情况下内部调用A1()。现在,如果你调用a.m1(),它将打印'Inside A的m1方法'。这是因为引用是父类型,父引用只能访问父类方法。如果您的父类没有m1而您的类有m1,那么您将收到编译时错误。

© www.soinside.com 2019 - 2024. All rights reserved.