日期:2014-05-20  浏览次数:20916 次

JAVA的一道面试题
Java code

public class Test{
    private static Test tester = new Test(); //step 1
    private static int count1;               //step 2
    private static int count2 = 0;           //step 3
    public Test(){                           //step 4
        count1++;
        count2++;
        System.out.println("" + count1 + count2);
    }
    public static Test getTester(){          //step 5
        return tester;
    }
    
    public static void main(String[] args){
       Test.getTester();
    }
}


问:以上代码执行的顺序~,输出的结果~

这是我昨天面试时碰到的一题,我尽量还原了原题。先说一下,这里count1未初始化可不是我忘了,原题就是这么搞D~
正好我对这种带有自身类型的字段的情况有些迷糊,索性答曰:“有变量未初始化,编译器可能会报错”~

我想问的是,如果忽略未初始化错误的话,以上代码执行顺序到底如何?

------解决方案--------------------
根据static 对象的性质,程序的执行流程为:

Test tester = null;
int count1 = 0;
int count2 = 0;

tester = new Test();

count1 ++;
count2 ++;
输出 1 1

count2 = 0;
最终结果为1 0,输出为1 1
------解决方案--------------------
步骤如同6L所说:

1,JVM虚拟机启动是通过引导类加载器(Bootstrap Class Loader)加载一个初始化类来完成,这个类由虚拟机的具体实现指定,也就是一般意义上的启动类(主类);然后虚拟机链接这个类,初始化并调用它的public void main(String[])方法。

2,面试题中根据上下文可认为初始化类就是Test类,所以:
a, 首先装载这个类,然后在链接的准备阶段(链接包括验证、准备、引用三个阶段),为所有类(静态)变量分配内存,设为为默认值(Test tester = null; int count1 = 0; int count2 = 0;)

b, 链接完成后,进行(类)初始化,按代码中声明顺序进行类(静态)变量的初始化,也就是先调用
Java code
        private static Test tester = new Test(); //step 1

------解决方案--------------------
6L 10L正解
的确是14235
只要注意在4的时候
Java code

    private static int count1;               //step 2
    private static int count2 = 0;           //step 3

------解决方案--------------------
Test.getTester();
JVM规定当4中情况下会出事类,其中一种酒是调用类的静态方法的时候。所以很明显这里调用Test的静态方法getTester所以Test会进行初始化。那么static的部分会被触发。根据初始化的顺序,那么很明显应该执行:
private static Test tester = new Test();
然后
private static int count1
private static int count2
也会被初始化,但是由于他们是int型的,所以初始化为0
这里就是创建Test对象咯,接下来就是进入Test的构造方法,
count1++;
count2++;
System.out.println("" + count1 + count2);
由于count2还没有进行赋值,所以它目前为0;所以 ++后count1和count2都是1
然后接下来就不用再说了吧。