通过这篇文章总结一下JAVA类实例化时,子类和父类中的构造方法,静态代码块,代码块和普通方法的调用顺序,首先编写两个测试类:
父类:
public class Father {
{
System.out.println("父类代码块");
}
static {
System.out.println("父类静态代码块");
}
public Father(){
System.out.println("父类构造方法");
hehe();
}
public void hehe(){
System.out.println("父类hehe方法");
}
}
子类:
public class Son extends Father{
{
System.out.println("子类代码块");
}
static {
System.out.println("子类静态代码块");
}
public Son(){
System.out.println("子类构造方法");
hehe();
}
public void hehe(){
System.out.println("子类hehe方法");
}
}
测试方法:
public class Main {
public static void main(String[] args) {
Son s = new Son();
}
}
输出的顺序是:
父类静态代码块
子类静态代码块
父类代码块
父类构造方法
子类hehe方法
子类代码块
子类构造方法
子类hehe方法
其实规律也很简单,只有以下几条:
- 静态代码块在类加载时就会被执行;
- 子类的构造方法中会默认加上调用父类构造器的方法super(),并且加在构造器代码的第一行;
- 普通代码块的方法会被编译进构造器,并加在super()的后面;
- 调用类中的其他方法会默认加上this。
根据规则1,所以首先输出的是静态代码块中的内容,然后根据规则2,Son中调用super(),所以会先调用Father的构造器。又根据规则3,所以先输出父类普通代码块中的内容,再输出父类构造器的内容;父类中调用hehe(),调用方式可以看成this.hehe(),此时的this为Son,所以输出的是Son的hehe方法。接下来在输出Son中的代码块和构造方法的内容,最后输出Son的hehe方法内容。