Java实现子类自动调用父类无参构造函数
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");
}
}
从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。
用我们老师的话来说就是:不管什么时候,不管能不能用到,先把无参构造函数写出来,避免出错。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
解析Orika的MapperFacade 属性赋值的使用问题
在我们实际开发中,常常会有对象与对象之间的转化,或者把一个对象的数据转化到另一个数据之中,如果我们手动的一个一个的set就会比较麻烦,代码段看起来也会比较长。而Orika的MapperFacade就是解决这个问题的,实现对象属性的复制2021-12-12
IDEA实现纯java项目并打包jar的步骤(不使用Maven,Spring)
在Java开发中我们通常会将我们的项目打包成可执行的Jar包,以便于在其他环境中部署和运行,这篇文章主要介绍了IDEA实现纯java项目并打包jar(不使用Maven,Spring)的相关资料,需要的朋友可以参考下2025-08-08


最新评论