前言
最近在学习过程中发现项目代码中使用了继承来简化核心功能代码,今天又加深了一些理解和体会。
实现
理论部分
先说一下结论:
无论通过子类的无参构造还是有参构造方法去实例化子类时,如果没有显式地调用父类的构造方法,那么 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 继承中父类与子类的加载顺序。