Java:继承中父类与子类构造方法的加载顺序

郎家岭伯爵 2024年01月25日 464次浏览

前言

最近在学习过程中发现项目代码中使用了继承来简化核心功能代码,今天又加深了一些理解和体会。

实现

理论部分

先说一下结论:

无论通过子类的无参构造还是有参构造方法去实例化子类时,如果没有显式地调用父类的构造方法,那么 Java 会先去隐式地调用父类的无参构造来初始化父类;当然也可以通过在子类的构造方法中显式地调用父类的构造方法(有参或者无参均可)来初始化父类。

如果父类仅有有参构造,没有无参构造,那么在子类的构造方法中必须显式地调用父类的有参构造方法,否则会编译报错。

简而言之,在子类实例化前,必须完成父类的初始化。

代码部分

以下代码可以很好地得出以上结论,这里不再赘述。

主类:

package extendsdemo1;

/**
 * @author 郎家岭伯爵
 * @time 2024/1/15 10:54
 */
public class Demo {
    public static void main(String[] args) {
//        Students students1 = new Students();
        Students students = new Students(20);
    }
}

父类:

package extendsdemo1;

/**
 * @author 郎家岭伯爵
 * @time 2024/1/15 10:53
 */
public class Person {

    protected int age;

    public Person(){
        System.out.println("Person 无参构造");
    }

    public Person(int age){
        System.out.println("Person 有参构造 age:" + age);
    }
}

子类:

package extendsdemo1;

/**
 * @author 郎家岭伯爵
 * @time 2024/1/15 10:54
 */
public class Students extends Person {

    public Students() {
        // 这里Java会隐式地调用Person的无参构造
        System.out.println("Student 无参构造");
    }


    public Students(int age) {
        // 显式地调用Person的有参构造
        super(age);
        System.out.println("Student 有参构造 age:" + age);
    }
}

总结

再深入学习和理解下 Java 继承中父类与子类的加载顺序。