看阿里巴巴的一道笔试题如下:
class T implements Cloneable{
public static int k = 0;
public static T t1 = new T("t1");
public static T t2 = new T("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");//相当于隐式
public int ding = print("ding");
{
print("构造快");
}
static {
print("静态块");
}
public int jie = print("jie");
public T(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n; ++ i;
}
public static int print(String str){
System.out.println((++k) +":" + str + " i=" + i + " n=" + n);
++n;
return ++ i;
}
public static void main(String[] args){
T t = new T("init");
}
}
1:j i=0 n=0
2:ding i=1 n=1
3:构造快 i=2 n=2
4:jie i=3 n=3
5:t1 i=4 n=4
6:j i=5 n=5
7:ding i=6 n=6
8:构造快 i=7 n=7
9:jie i=8 n=8
10:t2 i=9 n=9
11:i i=10 n=10
12:静态块 i=11 n=99
13:j i=12 n=100
14:ding i=13 n=101
15:构造快 i=14 n=102
16:jie i=15 n=103
17:init i=16 n=104
根据类初始化的顺序:
1、类的装载 -> 链接(验证 -> 准备 -> 解析) -> 初始化 -> 对象实例化;
红色、绿色、黄色的执行结果是在本程序源代码中下面的静态成员变量被初始化完成之前,已经有两个实例的初始化了,因此棕色代码依旧是类的初始化的过程。
2、public int j = print("j");此处相当于隐式代码,在对象初始化时候从上往下执行,如果构造函数在该代码下面先执行该代码,因为构造函数将隐式代码和构造函数看出一个整体来执行。5、10、17的执行结果是构造函数的执行结果。
3、类成员变量和代码块之间的执行顺序是先执行成员变量再执行代码块。