首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

JAVA的一道面试题,该如何解决

2012-03-26 
JAVA的一道面试题Java codepublic class Test{private static Test tester new Test() //step 1private

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
然后接下来就不用再说了吧。

热点排行