public class InitializeDemo {
private static Integer k = 1;
private static InitializeDemo t1 = new InitializeDemo("t1");
private static InitializeDemo t2 = new InitializeDemo("t2");
private static int i = print("i");
private static int n = 99;
{
print("初始化块");
j=100;
}
public InitializeDemo(String str) {
System.out. println((k++)+":" + str + " i=" + i + " n=" +n);++i;
++n;
}
static {
print( "静态块");
n=100;
}
private int j = print( "j");
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] args){
InitializeDemo test = new InitializeDemo("test");
}
}
运行结果
1、首先main方法入栈
然后从上往下执行顺讯
两个阶段:首先将所有的静态的域赋值(0 或null或false)执行完后
K=0 ; t1,t2 都为null; i=0; n=0;
然后到了静态代码块
此时他不执行
然后进行第二遍执行
对静态的初始化语句 和初始化块
k=1;
到
碰到了静态初始化语句 new
一旦碰到new 就从上往下找找非静态的初始化语句
然后就碰到了
此时执行代码块内的内容
执行 print 方法
k已经赋值为1所以 打印出 1 并将k修改为2 ,所以为第一行输出
然后接着找非静态语句
然后打印,就是第二行
然后没有静态代码块,开始执行构造函数
得到第三行打印
然后 new 出来的t1已经执行完毕,进行new t2 所以一样的过程
t2 new 完以后
向下执行 遇到
接着打印
在向下将n赋值为99
再到静态代码块 此时执行 并将 n 赋值为100
打印第8航
对象身被加载完,接下来是new对象
所以 初始化块又被执行
然后及时 打印 j
再接着构造方法
代码执行完毕