谁能解释构造函数,继承和运行时多态如何工作?还要解释以下输出背后的逻辑

时间:2019-03-27 05:21:11

标签: java constructor polymorphism

我理解我的输出背后的原因是运行时多态性。但是我不知道怎么办? 请说明运行时多态性,构造函数和继承之间的关系。

这是JAVA代码。我对Triend理解了运行时多态性,但未能弄清楚。

软件包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()称为

2 个答案:

答案 0 :(得分:0)

继承时默认从子类中调用

super()。这是由编译器完成的。

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

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

尝试以下操作,您将遇到编译错误。

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

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

答案 1 :(得分:0)

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

之类的B2构造函数中调用超级构造函数
    B2(){
        super();
        System.out.println("Constructor B() called"); 
    }

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