Java子类自动调用父类无参构造函数
今天在刷题的时候看到一道题:
public class A {
public A() {//父类A的无参构造函数
System.out.println("A");
}
}
public class B extends A{
public B() {//子类B的无参构造函数
System.out.println("B");
}
}
public class TestAB {
public static void main(String[] args) {
A a = new A();//创建一个A类对象
B b = new B();//创建一个B类对象
}
}
问题是输出的结果是什么,我下意识觉得太简单了,这不就是AB嘛,创建一个A类对象时去调用A的无参构造函数,输出A;创建一个B类对象时去调用B的无参构造函数,由于我下意识地认为子类B的无参构造函数没有super(),我就认为它不会去调用父类A的无参构造函数,所以我的结果是B。
当然我错了,结果是AAB。
下面的例子可以说明这个问题:
public class A {
public A(int a) {
System.out.println("A");
}
}
public class B extends A{
public B() {
System.out.println("B");
}
}
public class TestAB {
public static void main(String[] args) {
A a = new A(1);
B b = new B();
}
}
结果是:
原因就是在去创建子类对象时,它自动去调用父类的无参构造函数,由于A类只有一个有参构造函数,所以没有找到,编译错误。
当我们在子类中使用super(XXX),去调用父类有参构造函数就可以解决。
代码如下:
public class B extends A{
public B() {
super(1);
System.out.println("B");
}
}
从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。用我们老师的话来说就是:不管什么时候,不管能不能用到,先把无参构造函数写出来,避免出错。