static变量,static代码块,构造函数,代码块等的加载顺
2018-11-15 本文已影响11人
sendos
public class Main {
public Main() {
System.out.println("construct invoke"); // 执行顺序6
}
static int i = 4; // 执行顺序1
static {
i++;
System.out.println("first static invoke i = " + i); // 执行顺序2
}
private int j = 0; // new 对象之后才会开始执行 执行顺序4
{
System.out.println("匿名代码块执行" + j); // new 之后才执行 执行顺序5
}
static {
System.out.println("second static invoke"); // 执行顺序3
}
static void fun() {
System.out.println("call static function"); // 只有在调用的时候才会执行
}
public static void main(String [] args) {
new Main();
Main.fun();
}
}
运行结果:
image.png
- 在类加载阶段,先顺序执行static变量的赋值
- 顺序执行static代码块(static代码块只有在类加载的时候,才会执行,发生在类加载的初始化阶段,putstatic、getstatic、invokestatic、new指令一定会触发初始化阶段)
以下代码块只发生在实例对象时,并且没实例化一次对象,都会执行一轮
- 先顺序执行内部变量赋值
- 顺序执行匿名代码块
- 执行构造函数
静态方法只有在调用的时候,会有执行。