一道java面试题
来源:互联网 发布:oracle分批导出数据 编辑:程序博客网 时间:2024/06/07 23:16
Java codepublic 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(); }}
问:以上代码执行的顺序~,输出的结果~
答案:
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
注:这里省略了基类初始化和<clinit>的相关细节。
c, 上述步骤中的new 触发Test类的实例化(对象创建),先在堆上分配内存,然后设置对象变量(本例中没有)为初始值,然后调用<init>,细节略过,简单来讲这里会导致构造方法的调用,也就是:
- Java code
- public Test(){ //step 4 count1++; count2++; System.out.println("" + count1 + count2); }
很显然,这时候的count1和count2并没有被初始化,只是简单的被设置为默认值0(在链接的准备阶段)。所以打印出来的值总是11。
d, 接下来继续按声明顺序执行初始化,也就是:
- Java code
- private static int count1; //step 2 private static int count2 = 2; //step 3
e, 初始化完成之后,完成了初始类的加载,跳转到main方法开始执行。
所以顺序为14253,并且无论count2 和 count1为多少,打印出来的总是11.;如果交换一下顺序,比如
- Java code
- count 2 = 2; new test();
那么打印的结果将是13.
总结:关键是在实例化对象和初始化变量的顺序上
- 一道JAVA面试题
- 一道java面试题
- 一道java面试题
- 一道java面试题
- 一道java面试题
- 一道java面试题
- 一道JAVA编程面试题
- 一道JAVA编程面试题
- 求解一道Java面试题。
- java 一道线程面试题
- 一道有趣java面试题
- 一道java经典面试题
- 一道Java初始化面试题
- 一道JAVA IO面试题
- 一道JAVA IO面试题
- 浅谈一道java面试题
- google的一道JAVA面试题!!!
- google的一道JAVA面试题!!! (转)
- 项目管理
- 黑马程序员——多线程原来是这么简单
- 收藏几个网址学习用
- 清风博客
- 汇编在Win-TC中简单嵌套
- 一道java面试题
- VirtualBox中为Fedora16分配数据空间
- 优先队列 队列 栈 的使用方法
- Linux中的SUID/SGID
- 黑马程序员__集合框架
- 建立存储过程
- OpenCV2.3.1安装误区解释
- 经典人生感悟 看看你少了那一条!?
- 多年积累的20条编程经验