我从网上找了一下例子,然后把它放在idea里面debug,它的大体顺序是这样的
首先是类的静态方法,再是类的静态变量,然后是创建静态对象,创建静态对象的时候,首先是非静态的成员,(但是在这里它因为后面的静态变量还没初始化,所以创建静态对象的时候,它不对里面的非静态变量进行初始化),非静态语句块的执行,在加载时按代码的先后顺序进行,然后创建完静态对象之后,继续初始化后面的静态变量以及静态块,完成初始化静态变量以及静态代码块之后开始加载非静态成员/代码块,最后调用构造方法。
测试代码如下:
import java.util.*;
public class StaticTest {
public static int k = 0;
public static StaticTest t1 = new StaticTest("t1");
public static StaticTest t2 = new StaticTest("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static{
print("静态块");
}
public StaticTest(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
public static void main(String[] args) {
StaticTest t = new StaticTest("init");
}
}
首先运行的是
public static int k = 0;
然后是
public static StaticTest t1 = new StaticTest("t1");
在这里它会调用构造函数
public StaticTest(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
在执行构造函数之前,它会先执行非静态成员以及代码块的调用。
public int j = print("j");
{
print("构造块");
}
因为这还是在类加载过程,所以 j 并不初始化,等到后面再初始化,然后调用print("j")方法
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
打印出:
1:j i=0 n=0
然后到构造块部分,同样的调用print(String str)方法,打印出:
2:构造块 i=1 n=1
运行完非静态成员和非静态代码块后,就执行构造方法,打印出:
3:t1 i=2 n=2
后面那个创建静态对象是一样的过程,就不过多描述了,分别打印出:
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
然后运行这一段代码:
public static int i = print("i");
调用print(String str)方法,打印出:7:i i=6 n=6
接着运行以下代码:
public static int n = 99;
static{
print("静态块");
}
先是初始化n=99,然后运行静态代码块里面的内容,打印出:8:静态块 i=7 n=99
然后调用main方法里面的:
StaticTest t = new StaticTest("init");
先是初始化非静态成员 j 以及运行非静态代码块
public int j = print("j");
{
print("构造块");
}
此时j被初始化成101,然后非晶态代码块里面打印:10:构造块 i=9 n=101
然后执行构造方法里面的内容,打印出:11:init i=10 n=102。到此结束。
一共打印出来的结果如下:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
得到的静态成员变量的内容如下图
希望能帮助到大家,文章中如果有不对的地方,请指出来,谢谢大家。