[转]Java中子类继承父类时是否继承构造函数

Java继承中队构造函数是不继承的,只是调用(隐式或显式)。
以下是例子

public class FatherClass {

    public FatherClass() {
        System.out.println(100);
    }

    public FatherClass(int age) {
        System.out.println(age);
    }
}

public class SonClass extends FatherClass {
    public SonClass() {
        
    }
    
    public SonClass(int c) {
        System.out.println(1234);
    }

    public static void main(String[] args) {
        SonClass s = new SonClass(66);
    }
}

编译后执行结果是什么呢?

分析SonClass s= new SonClass(66);执行这句时的调用。

public SonClass(int c) {
    System.out.println(1234);//系统会先调用父类的无参数构造函数super()
}

在这个构造函数中,等价于:

public SonClass(int c) {
    super();
    system.out.println(1234);
}

所以结果是
100
1234

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后在执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。

如果子类构造是这样写的:

public SonClass(int c) {
    super(22);//必须是第一行,否则不能编译//显式调用了super后,系统就不再调用无参的super()了。
    System.out.println(1234);
}

执行结果是
22
1234


总结一:构造函数不能继承,只能调用而已。

如果父类没有无参构造函数,创建子类时,不能编译,除非在构造函数代码体中的第一行,必须是第一行显式调用父类有参构造函数,如下:

public SonClass() {
    super(777);//显示调用父类有参构造函数
    System.out.println(66);
}

如果不显式调用父类有参构造函数,系统会默认调用父类无参构造函数super();
但是父类中没有无参构造函数,所以它不就是不能调用了。所以编译就通不过了。

总结二:创建有参构造函数后,系统就不再有默认无参构造函数。

如果没有任何构造函数,系统会默认有一个无参构造函数。

标签: none

添加新评论