今天看到一面试题,对于输出结果为 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.