题目如下:
public class Test{
private static int k = 1;
private static Test t1 = new Test("t1");
private static Test t2 = new Test("t2");
private static int i = print("i");
static {
print("静态块");
n = 100;
}
private static int n =99;
{
print("构造块");
j = 100;
}
public Test(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n );
++i;
++n;
}
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) {
Test n = new Test("初始化");
}
}
该问题,结果是多少呢?
首先在java中进行的是类加载(静态初始化块,静态初始化语句从上向下进行初始化),类加载完毕以后,遇到new 从上向下执行初始化(非静态的:没有static关键字) 最后执行对应的那一个构造函数,类加载完,如果你还有new 操作符 ->从上往下执行非静态的初始化。
那么就大概知道了 先执行static 静态部分。
遇到new 则需要执行非静态的初始化,并且是最后执行的构造函数。
new执行完后继续按顺序执行static静态部分
然后在类的加载完成后,main方法内如果有new,则需要把除了static的部分进行初始化。
最后的结果就是