java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java子类自动调用父类无参构造函数

Java实现子类自动调用父类无参构造函数

作者:妄念ol

子类在Java中创建对象时,会自动调用父类的无参构造函数,如果父类只有有参构造函数,而子类没有使用`super()`显式调用父类构造函数,编译器会报错,因此,建议在类中总是定义无参构造函数以避免潜在的错误

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");
    }
}

从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。

用我们老师的话来说就是:不管什么时候,不管能不能用到,先把无参构造函数写出来,避免出错。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文