JAVA的一道面试题

胡小来 2012-02-22 10:21:04

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~
正好我对这种带有自身类型的字段的情况有些迷糊,索性答曰:“有变量未初始化,编译器可能会报错”~

我想问的是,如果忽略未初始化错误的话,以上代码执行顺序到底如何?
...全文
2920 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutg0209 2012-03-14
  • 打赏
  • 举报
回复
看大家回复,学到不少东西啊
胡小来 2012-03-14
  • 打赏
  • 举报
回复
额…… 回帖好多哇
45楼可别太高看我了,我只是去应聘个码奴而已。
xiaokangbuben 2012-02-28
  • 打赏
  • 举报
回复
59楼和62楼的解释下,我懂了,谢谢啊。
Westmoon 2012-02-28
  • 打赏
  • 举报
回复
这个问题可以参考一下类的加载顺序,然后这个问题就一目了然了。
JVM 加载步骤,1、装载 2、连接 3、初始化
那么类成员默认值是什么时候设置的呢? 在连接阶段(这个阶段是不执行任何java代码的)。
各类型的成员的初始值大家都知道的。
然后就是初始化,顺序执行!
所以14235的执行顺序是正解。

补充,执行 4 时, 2,3还未执行,但已经有初始值(连接操作时)。
所以输出一直是 1 1
qianzhiyong111 2012-02-28
  • 打赏
  • 举报
回复
好帖,之前花时间研究过加载的问题,好久没注意这块,又忘了差不多了,看来十分基础的东西还是有必要烂熟于心的!
thomescai 2012-02-27
  • 打赏
  • 举报
回复
题目可以改一下:
public static void main(String[] args){
new Test().getTester();
}
ross 2012-02-27
  • 打赏
  • 举报
回复
回答一下54#的问题吧,java在初始化时,会由上向下进行static变量的初始化,即为static变量赋于java规定的初始值,因此初始化时:tester变量的值为null,count1因为是int类型java规定的初始值为0;count2的初始值因为也是int因此初始值也是0;
这时初始化完毕,开始由上向下进行赋值操作,一楼问的问题也由这个时间点开始,因此为tester赋值了new Test(); 因此触发了test()构造函数的执行,这时执行了count1++,count2++,根据初始化的结果,执行完后,count1 = 1,count2=1,因此打印出来的结果就是11;
然后继续向下赋值,因为count1没有赋值操作,因此结果还是1,而count2有赋值操作,因此java使用了1这个赋值操作为count2赋值;然后就是main中写的Test.getTester()方法的执行了.
因此最后执行顺序为:14235!
ross 2012-02-27
  • 打赏
  • 举报
回复
唉,来晚了,围观一下吧!这个是考类的加载及初始化及实例化顺序的题,推荐一个视频吧,我下载过圣思园的一个java视频,讲的很到位,看完大家都会明白的!我不是做广告,请大家不要拍我!
奔跑的火车 2012-02-27
  • 打赏
  • 举报
回复
留着有时间看看
lirunfa 2012-02-27
  • 打赏
  • 举报
回复
14235
xiaokangbuben 2012-02-27
  • 打赏
  • 举报
回复
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);
}

小弟还有一点不是很懂,执行count1++,这时候如果step2没有声明的话那就应该没有count1这个变量,所以就应该先执行了step2,所以我认为是不是这样的顺序--1234,然后count2的赋值是没有执行的,只有声明,执行构造方法后然后才赋值的呢???请有空的高手指点下。。
wangxuesong0326 2012-02-26
  • 打赏
  • 举报
回复
弄懂了;""这个玩意让count1、count2转成字符串连接了。
count1++;
count2++;
System.out.println("" + count1 + count2);
tangliang604 2012-02-26
  • 打赏
  • 举报
回复
有意思,看大家的回复,学到不少啊
曾经的那些 2012-02-26
  • 打赏
  • 举报
回复
已经有很多人都分析的比较透彻了,其实最简单的方法就是用eclipse的Debug功能运行一下,观察执行过程
xgrsb2005 2012-02-26
  • 打赏
  • 举报
回复
LZ,这题毫无难度啊
warmersen 2012-02-25
  • 打赏
  • 举报
回复
受教了,不错例题.
hoarhoar 2012-02-25
  • 打赏
  • 举报
回复
这确实有个单例,但是不是单例模式,请看:
public Test(){ ...
构造器是公有的。
这道题考察的是:是否知道一个类加载时静态变量的初始化过程,其中还加入了一个对象实例化的影响,因为一个类加载时先把静态变量赋值为默认值,然后再初始化赋值,在赋值时又有一个对象被实例化了,构造器有影响了初始化值,最后 count2 = 0;又把构造器对count2的影响给抹掉了。

所以考察的是类加载时静态变量的初始化过程。
kernelkey 2012-02-25
  • 打赏
  • 举报
回复
重点 考的是 单例模式吧
孑孓 2012-02-25
  • 打赏
  • 举报
回复
关键是在实例化对象和初始化变量的顺序上
hoarhoar 2012-02-25
  • 打赏
  • 举报
回复
大家不给力呀,开动开动脑筋啊!
我目测,这道题绝对不是招聘码奴级别程序员的,应该是一个大公司招聘高级java程序员的题目,如果这道题出的如我修改的那样,这道题才是考到点子上了。
这就是那类让码奴咒骂出题者的题,他们会非常气愤:“我不思考这些程序细节,我就是能写好程序不行啊!”
楼主可不可以爆一下,这套题的面试目标应聘者的薪金范围是不是在8k~15k之间?你研究的越深入,你的身价也越高,这是码奴们及其反感的事。
码奴时我们每个程序员都要经过的一段道路,但是有些人(大部分)就停止了码奴的级别不肯进取了。这样不好,为了摆脱码奴的身份,尽量把所有能考虑的细节都去思考一番,绝不整天在论坛抱怨公司,设想如何在30岁前转行。
说的有点离题了啊,就是最近面试应聘者的那些问题太简单了,还有些人大大抱怨太难,我的那些都根本没有这个1%难。
加载更多回复(41)
史上最全的android和java面试文档集。包括有: java程序员面试宝典.txt Java面试宝典2011版-1C,Java基础部分.doc 三大框架面试题.zip 技术面试题.zip Android笔试题库 C语言终极面试宝典.doc Java笔试题目汇总.pdf Java面试宝典_2010.doc 面试全攻略100题.doc 智力题和答案.doc C语言面试题大汇总.doc 计算机专业必备笔试面试锦囊.doc 笔试.rar 面试题集合.zip C语言面试题大汇总1.doc 面试题集合 java面试题 JAVA面试题集合(项目2部).chm 华为笔试题大全(史上最齐全).doc JAVA题库.doc java面试题.zip Java面试宝典2011版-1A,Java基础部分.doc jsp笔试题全集.doc Java学习笔记(必看经典).doc android和java面试大全.rar JAVA精华.doc JAVA经典算法50题1.doc Android笔试题库.rar Java面试宝典2011版-1B,Java基础部分.doc Java工程师试题(机构招聘)20100526.doc C语言面试题大汇总面试题及答案.doc Java23种设计模式(总结)1.doc JAVA_WEB面试笔试题.doc 实施人员初试题20091009.doc 笔试智力题.doc C语言面试题.doc 2011android面试题目及其答案大全.doc java基础笔试题.doc 安卓鄙视题附答案.txt 史上最全的android面试题库.docx android工程师笔试试卷.doc Android面试题(详细答案).doc Android内测题.doc Java面试题2.doc JAVA面试题80页.doc 智力题.doc JAVA 综合面试题.pdf 分类后的葵花宝典 葵花宝典.doc 九阴真经.doc Java面试题1.doc 葵花宝典-数据库类.doc JAVA面试题集锦.doc Java程序员,面试必读.txt 软通动力招聘测试题.doc java面试葵花宝典.doc 新建 文本文档 (2).txt 125条常见的JAVA面试题.doc NET易筋经.doc 葵花宝典-Java Web类.doc 葵花宝典-基础类.doc 葵花宝典-数据库类1.doc 技术测评java.doc 技术测评.net.doc 瑞星笔试题(15道).doc 汉端笔试题(7页).doc 一道测试notepad笔试题.doc 奇虎面试题.doc 喜安科 面试题.doc 北京博彦科技笔试+面试.doc 清华同方开发的面试题 (有兴趣的看一下了 !) 中软的面试题(转贴).doc 亚控科技比试题.doc 神州泰岳测试试题(笔试)转贴.doc 一家通讯公司的面试题目.doc 软件测试工程师试题发布版.doc 某公司的面试试题.doc 一个外包测试公司的笔试题!.doc 时力科技面试题.doc 合力金桥的笔试题.doc 一道数据库的笔试题目.doc 传视数码公司的面试题.doc 美国英网软件公司题目.doc 软件测试工程师测试试题大集合(二)包括答案.d 波尔世通的笔试+面试.doc 瓦瑟笔试题(限男性).doc 软通动力面试笔答.doc 常见的测试题(转贴).doc 北京大学计算机科学技术研究所.doc 联合网视面试题.doc 缺陷的等级划分,一个经常被问到的问题.doc 软件测试工程师笔试试题(大集合).doc 千像互动的笔试.doc 2012java面试题分析大全.doc JAVA面试题集合(项目2部).chm JAVA经典算法50题1.doc Java工程师试题(机构招聘)20100526.doc Java23种设计模式(总结)1.doc 实施人员初试题20091009.doc 框架图.png struts面试题 hibernate面试题 三大框架.txt JAVA题库.doc

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧