我理解输出背后的原因是运行时多态性。但我无法弄清楚如何?请解释运行时多态,构造函数和继承是如何相关的。
这是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()
默认情况下,super()在继承时从子类调用。这是由编译器完成的。
这样做是因为如果超类初始化其构造函数中的任何私有变量,则需要对其进行初始化。话虽如此,但并不意味着创建了2个对象。仅创建子类的一个实例。
在您的情况下,B2构造函数默认调用A1构造函数。
尝试在下面执行,您将遇到编译错误。
Class A1{
public A1(String msg){
}
}
Class B2 extends A1{
public B2(){
}
}
当初始化该类的对象时,将调用类的构造方法。在您的示例中,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,那么您将收到编译时错误。