今天看到一面试题,对于输出结果为 0 有很多一知半解的人解释,
对于新手来说看得似懂非懂,然后看完还是一头雾水。
@Test
public void test1(){
Integer i = new Integer(0);
//Integer@853 -----1
add(i);
//Integer@853 -----5
System.out.println(i);//0
i +=3;
//Integer@864 -----6
System.out.println(i);//3
}
private void add(Integer i) {
//Integer@853 -----2
i = i + 3;
//Integer@864 -----3
i = new Integer(i);//3
//Integer@865 -----4
}
在代码上我都标注了 i 的各步骤的引用地址。
从调试信息上来看,方法传递的就是对象的地址。
而让新手迷惑的关键地方是,add 方法中改变了 i 的值啊,为什么还是返回 0 ?
Integer 的加法运算生成了一个新的 Integer 对象,并申明为变量 i,而局部变量的生命周期只存在自己的方法中,两个方法中的变量名都为 i,但是此时他们已经没有关系了。
不知道解释的是否正确,希望错误的地方各位指正,以免让别人产生误解。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.