JAVA父子类构造方法执行顺序
测试代码:
父类:
public class Test {
String name;
public Test(){
System.out.println("父类无参数构造");
TestPrint();
}
// public Test(String name){
// this.name = name;
// System.out.println("父类有参构造");
// }
public void TestPrint(){
System.out.println("父类testPrint");
};
}
子类:
public class TestChild extends Test {
public String name;
public TestChild(){
super();
System.out.println("子类无参数构造");
}
// public TestChild(String Name){
// super(Name);
// this.name = Name;
// System.out.println("子类有参构造");
// }
public void TestPrint(){
System.out.println("子类重写testPrint");
}
public static void main(String[] args) {
TestChild test = new TestChild();
}
}
实验一:
实验条件: 父子类只有无参构造
实验结果:
实验结论:先调用父类的无参构造,再调用子类的无参构造。
实验二:
实验条件:父子类有无参构造,也有有参构造。
实验结果:
1、子类调用无参构造:
2、子类调用有参构造:
3、子类有参构造中显示调用父类的有参构造:
实验结论:依旧是先调用父类的构造方法再调用子类的构造方法。当子类构造方法未显示调用父类的构造方法时。默认的是父类的无参构造。只有显示调用(super(name))才会调用父类的有参构造方法。
通过上述实验我们可以得出结论:
子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显的使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。如果父类没有无参的构造函数,那么子类就需要在自己的构造函数中显示的调用父类的构造函数。
为了加深理解 我们通过一个小工具(jclasslib)看看内部new 子类时,到底发生了什么
我们可以很清楚的看到 在new 的对象中 构造方法的执行顺序,先执行 Test.<init> 也就是父类的构造方法,之后再进行自己内部的一些打印。