我理解我的输出背后的原因是运行时多态性。但是我不知道怎么办? 请说明运行时多态性,构造函数和继承之间的关系。
这是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()称为
答案 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,那么您将收到编译时错误。