Java基础之代码执行顺序深入解析
结合实例代码分析:
public class demo6 {
public static void main(String[] args) {
new Son();
System.out.println("--------------");
new Son();
System.out.println("--------------");
new Father();
}
}
class Father{
public Father(){
System.out.println("111111");
}
{
System.out.println("222222");
}
static {
System.out.println("333333");
}
}
class Son extends Father{
public Son(){
System.out.println("444444");
}
{
System.out.println("555555");
}
static {
System.out.println("666666");
}
}
编译结果:
333333
666666
222222
111111
555555
444444
--------------
222222
111111
555555
444444
--------------
222222
111111
可以看出分两种情况:
- 若类还未被加载
- 类已加载
1. 若类还未被加载
- 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
- 执行子类的静态代码块和静态变量初始化。
- 执行父类的普通代码块
- 执行父类的构造函数
- 执行子类的普通代码块
- 执行子类的构造函数
即:
333333
666666
222222
111111
555555
444444
2. 类已加载
由于static静态代码块只会执行一次,所以第二次调用Son()
不会再执行。所以执行顺序为:
- 执行父类的普通代码块
- 执行父类的构造函数
- 执行子类的普通代码块
- 执行子类的构造函数
即:
222222
111111
555555
444444