问题很简单,就是下面的代码打印出什么?
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");
}
}
//运行结果
1: 初始化块 i=0 n=0
2: j i=1 n=1
3: t1 i= 2 n=2
4: 初始化块 i=3 n=3
5: j i=4 n=4
6: t2 i= 5 n=5
7: i i=6 n=6
8: 静态块 i=7 n=99
9: 初始化块 i=8 n=100
10: j i=9 n=101
11: test i= 10 n=102
分析:唯一的问题就是弄清楚java类的初始化顺序。main方法执行前,进行类的初始化。类的初始化一般只执行一次:(静态属性=静态代码块)>(非静态属性=匿名构造器=非静态代码块)>非匿名构造器
先对静态属性和静态代码块进从上到下的初始化
(1)k=1;
(2)new一个对象t1,t1也是一个InitializeDemo 类型的对象,所以要对InitializeDemo 非静态变量,非静态代码块以及构造器依次进行初始化
加载第一个非静态代码块,执行print方法(i和n的初始值是0)
输出 ===> 1: 初始化块 i=0 n=0
(k=2,i=1,n=1,j=100)- 加载下一个非静态变量j,执行print方法
输出 ===> 2: j i=1 n=1
(k=3,i=2,n=2,j=2)
执行带参构造器
输出 ===> 3: t1 i= 2 n=2
(3)完成t1后,t2与t1同理,依次输出===>
4: 初始化块 i=3 n=3
5: j i=4 n=4
6: t2 i= 5 n=5
(k=7,i=6,n=6)
(4)接着初始化i,执行print方法
输出===> 7: i i=6 n=6
(k=8,i=7,n=7)
(5)n=99;
(6)执行静态代码块
输出===> 8: 静态块 i=7 n=99
(k=9,i=8,n=100)
(7)最后 new InitializeDemo(“test”) 和t1,t2相同输出三次===>
9: 初始化块 i=8 n=100
10: j i=9 n=101
11: test i= 10 n=102