这个是我看到一个同学去面试,然后回来之后说的一道面试题,看了之后发现,简单的基础题也可以考倒不少人啊,先看看题吧。- public class Test01
- {
- public static int k = 0;
- public static Test01 t1 = new Test01("t1");
- public static Test01 t2 = new Test01("t2");
- public static int i = print("i");
- public static int n = 99;
- public int j = print("j");
- {
- print("构造块");
- }
- static {
- print("静态块");
- }
- public Test01(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) {
- Test01 t = new Test01("init");
- }
- }
复制代码 要求写出运行结果。。。。。
结果是:
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
开始看了之后确实一下子没有搞定,于是复习了一下基础,又认认真真的看了一遍代码
最后分析了一下:
这道题考的是静态代码块,构造代码块和静态变量等在程序中的执行顺序。
1:j i=0 n=0
我们都知道在有静态变量的时候,程序会最先执行静态的,也就是最先执行
-->public static Test01 t1 = new Test01("t1");
那么这个代码会建立一个实例对象,也就是会先完成非静态成员变量的赋值也就是
-->public int j = print("j");
由于i当前还未赋值,所以默认值是0,那么
调用的方法会打印--> 1:j i=0 n=0
2:构造块 i=1 n=1
成员变量的定义完成之后就会调用构造方法,如果有构造代码块就会先执行构造代码块也就是
-->print("构造块");
-->2:构造块 i=1 n=1
3:t1 i=2 n=2
这个时候就开始执行构造方法,也就是public Test01(String str),到此第一个创建的静态实例已经完成。
第二个和第一个一样。
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
接着是一个静态变量的赋值,
-->public static int i = print("i");
-->public static int n = 99;
之后n的值就变成了99了
8:静态块 i=7 n=99
接着执行后面的静态代码块
9:j i=8 n=100
最后所有静态的部分执行玩了之后就到了主函数了
-->Test01 t = new Test01("init");
10:构造块 i=9 n=101
11:init i=10 n=102
开始在看的时候也有点懵,不过之后自己理清顺序之后就蛮好理解了。
|
|