习题 1:据说是某大厂的经典面试题, 你能写出答案吗?
public class Test{
public static int k=0;
public static Test t1=new Test("t1");
public static Test t2=new Test("t2");
public static int i=print("i");
public static int n=99;
public int j=print("j");
static {print("静态块");}
public Test(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[] ar gs) {
new Test("init");
}
}
想要做对这道题我们必须了解类的加载过程和实例化过程:
- 类加载(准备和初始化)过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类
- 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块、构造方法中的代码)也是先父类后子类
- 如果在类加载的赋值过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程
---------- 运行结果 ----------
1:j i=0 n=0
2:t1 i=1 n=1
3:j i=2 n=2
4:t2 i=3 n=3
5:i i=4 n=4
6:静态块 i=5 n=99
7:j i=6 n=100
8:init i=7 n=101
输出完成 (耗时 0 秒) - 正常终止