2 simonhook SimonHook 于 2015.06.24 15:34 提问

一道Java笔试题,求解答(关于类的加载与初始化)

自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢!

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
*/

5个回答

tongyi55555
tongyi55555   2015.06.24 18:09
已采纳

这道题比较复杂的地方就是静态变量里面有两个自己的实例对象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构造函数));

qq_16168871
qq_16168871   2015.06.24 16:06

代码贴到eclipse中,进行调试,就知道他们的执行顺序了。

jiawei0418
jiawei0418   2015.06.24 16:27

静态块》块》构造器

bulusli3
bulusli3   Ds   Rxr 2015.06.24 17:04

java代码执行的顺序是static->代码块->构造函数。在你这个例子中,main函数没有调用之前,类加载的时候其实已经执行了一部分输出。首先是执行static代码块,而static需要先按static字段的顺序初始化static字段,初始化k为0,初始化t1,t1调用了构造函数,而构造函数调用之前需要先初始化实例字段和执行普通代码块,即a和j,此时会输出1和j的值,然后执行普通代码块,输出“代码块”的字样,最后执行构造函数的输出。接下来static继续初始化t2,原理和t1一样,接下来是初始化i的值,最后执行static代码块的输出。static代码块执行完之后,main函数中的new开始执行。顺序和t1一样。

yingzi19911010
yingzi19911010   2015.06.24 22:36

同意楼上的解答,就是这个执行顺序

Csdn user default icon
上传中...
上传图片
插入图片