public class InitializeDemo {
private static int 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");
}
}
程序由main方法作为唯一入口,要创建InitializeDemo这个类对象,创建之前,要先检测这个类有没有被加载过,没有加载过,要先加载这个类,进行类的初始化(类加载如方法区的时候,也默认为类中的静态方法和变量在方法区的内存空间申请了地址,即为k,t1,t2,i和n都申请了地址空间,只是这个时候k=0,t1为null,i=n=0),程序由上到下执行静态的代码和代码块。
首先将k赋值为1,然后执行t1的构造方法,这时又涉及到了这个类的创建,因为不是第一次创建这个对象,因此只会从上到下执行一遍非静态的初始化语句和初始化块。
所以首先执行,print("初始化块"),打印 1 :初始化块 i=0 n=0 ,在执行对n和i的加1操作,j=100没有用,赋值完被释放了。
再执行 private int j = print("j"); 打印 2 :j i=1 n=1 ,在执行对n和i的加1操作,并对j赋值2.
最后执行t1的构造方法,打印 3:t1 i=2 n=2,再对n和i进行+1操作。
接着程序执行到了第三行,重复上面的步骤,从上到下执行一遍非静态的初始化语句和初始化块,最后执行构造方法,获得如下打印
4:初始化块 i=3 n=3
5:j i=4 n=4
6:t2 i=5 n=5
之后执行程序的第四行,打印7:i i=6 n=6,对n进行+1操作,再将i+1后的结果,返回给i,此时i=7,n=7。
之后执行程序的第五行,对n赋值为99,此时i=7,n=99
再向下执行静态语句或代码块,执行代码块中的print("静态块"),打印8:静态块 i=7 n=99,再对i和n作加一操作
向下执行,对n赋值100。
静态语句和块执行完毕,从上到下执行一遍非静态的初始化语句和初始化块
9:初始化块 i=8 n=100
10:j i=9 n=101
最后执行test的构造方法,打印11:test i=10 n=102
结束!