本文内容不涉及类加载、静态变量、静态代码块的知识。
单个类的执行顺序
测试代码
public class InitTestFather {
private P p1 = new P("父 - 变量1");
{
System.out.println("父 - 代码块1");
}
public InitTestFather() {
System.out.println("父 - 构造方法");
}
{
System.out.println("父 - 代码块2");
}
private P p2 = new P("父 - 变量2");
public static void main(String[] args) {
new InitTestFather();
}
}
执行结果
new P:父 - 变量1
父 - 代码块1
父 - 代码块2
new P:父 - 变量2
父 - 构造方法
------------------------------------
从执行结果可以看出变量初始化、构造代码块按照代码书写的顺序执行,但构造方法始终在最后执行。
父子类的执行顺序
public class InitTestChild extends InitTestFather {
private P p1 = new P("子 - 变量1");
{
System.out.println("子 - 代码块1");
}
public InitTestChild() {
System.out.println("子 - 构造方法");
}
{
System.out.println("子 - 代码块2");
}
private P p2 = new P("子 - 变量2");
public static void main(String[] args) {
new InitTestChild();
}
}
new P:父 - 变量1
父 - 代码块1
父 - 代码块2
new P:父 - 变量2
父 - 构造方法
------------------------------------
new P:子 - 变量1
子 - 代码块1
子 - 代码块2
new P:子 - 变量2
子 - 构造方法
从执行结果可以看出先初始化父类,再初始化子类,而且分别按照上面所说的顺序执行