自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢!
public class Alibaba {
public static int k = 0;
public static Alibaba t1 = new Alibaba("t1");
public static Alibaba t2 = new Alibaba("t2");
public static int i = print("i");
public static int n = 99;
private int a = 0;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public Alibaba(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String args[]) {
Alibaba t = new Alibaba("init");
}
}
/*
Output:
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
*/
这道题比较复杂的地方就是静态变量里面有两个自己的实例对象t1和t2,容易混乱,再有就是静态块调用时记得n已经赋值99了。
详细说明下:
第一梯队是静态变量和静态块,跟类的实例没有关系的,只要类加载就会先运行,且跟前后顺序有关,因此本题中从k变量开始按顺序执行static开头的;
第二梯队是普通变量和代码块,这个要到初始化变量的时候才会调用,很好理解,变量是实例的变量,没有实例是不会初始化普通变量的,普通变量和代码块的执行顺序也是按定义的前后执行,比如int j要在代码块的前面执行;这里特殊的是第三行初始化t1时产生了实例对象,因此需要调用t1的普通变量j和代码块,因此先输出的是j;
第三梯队是构造方法,输出的最后一行就是调用构造方法输出的。
因此执行的顺序是 k-->t1(t1.j,t1.代码块,t1构造函数)-->t2(t2.j,t2.代码块,t2构造函数)-->i-->n-->静态块-->main函数(初始化init(init.j,init.代码块,init构造函数));
代码贴到eclipse中,进行调试,就知道他们的执行顺序了。
静态块》块》构造器
java代码执行的顺序是static->代码块->构造函数。在你这个例子中,main函数没有调用之前,类加载的时候其实已经执行了一部分输出。首先是执行static代码块,而static需要先按static字段的顺序初始化static字段,初始化k为0,初始化t1,t1调用了构造函数,而构造函数调用之前需要先初始化实例字段和执行普通代码块,即a和j,此时会输出1和j的值,然后执行普通代码块,输出“代码块”的字样,最后执行构造函数的输出。接下来static继续初始化t2,原理和t1一样,接下来是初始化i的值,最后执行static代码块的输出。static代码块执行完之后,main函数中的new开始执行。顺序和t1一样。
同意楼上的解答,就是这个执行顺序