package com.test;
public class StaticProcessSequence {
public static void main(String[] args) {
new StaticProcessSequence(); //4.第四步,new一个类,但在new之前要处理匿名代码块
System.out.println("i= " + i + " i2= " + i2);
}
static int num = 4; //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定
static int i = 4;
static{
i = -4;
i2 = -5;
}
static int i2 = 5;
{
num += 3;
System.out.println("b"); //5.第五步,按照顺序加载匿名代码块,代码块中有打印
}
int a = 5; //6.第六步,按照顺序加载变量
{ // 成员变量第三个
System.out.println("c"); //7.第七步,按照顺序打印c
}
StaticProcessSequence() { // 类的构造函数,第四个加载
System.out.println("d"); //8.第八步,最后加载构造函数,完成对象的建立
}
static { // 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印a
System.out.println("a");
}
static void run() // 静态方法,调用的时候才加载// 注意看,e没有加载
{
System.out.println("e");
}
}
输出结果:
a
b
c
d
i= -4 i2= 5
一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法
1.静态代码块(只加载一次)
2.构造方法(创建一个实例就加载一次)调用构造方法之前会先初始化成员变量
3.静态方法需要调用才会执行,所以最后结果没有e
参考自
https://blog.youkuaiyun.com/mrzhoug/article/details/51581994
另: 对于静态块和静态变量,会先初始化成员变量,但是不给其赋值 ,然后按照编写顺序从上往下执行。所以造成了i和i2的赋值效果不同。
对于最后一句的解释:
static int i = 4;
static{
i = 5;
} //结果中i为5
static{
i = 5;
}
static int i = 4;
//结果中i为4