今天看到一面试题,对于输出结果为 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,但是此时他们已经没有关系了。
不知道解释的是否正确,希望错误的地方各位指正,以免让别人产生误解。