黑马程序员技术交流社区
标题:
一道繁琐基础面试题
[打印本页]
作者:
lihaotian_120
时间:
2013-10-11 11:46
标题:
一道繁琐基础面试题
这个是我看到一个同学去面试,然后回来之后说的一道面试题,看了之后发现,简单的基础题也可以考倒不少人啊,先看看题吧。
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
开始在看的时候也有点懵,不过之后自己理清顺序之后就蛮好理解了。
作者:
潘才新
时间:
2013-10-11 13:14
考的知识挺全
作者:
zhou5852
时间:
2013-10-15 16:27
的确 ,考的是new之后jvm怎么来出来对象在内存中的分配,以及如何来初始化对象。new 之后到底程序发生了什么。。。。以前知道,但是没见过把类的静态初始化都考进来的,很全
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2