• 1.6k

[已解决]头条视频面试题关于 java String,为什么下面代码输出 123 而不是 abc?

头条视频面试题,为什么下面代码输出 123 而不是 abc?

public class Main {  
    void replace(StringHolder a) {  
        a = new StringHolder("abc");  
    }  

    static class StringHolder {  
        public StringHolder(String value) {  
            this.value = value;  
        }  
        public String value;  
    }  

    public static void main(String[] args) {  
        Main m = new Main();  
        StringHolder test = new StringHolder("123");  
        m.replace(test);
        System.out.println(test.value);
    }  
}
阅读 857
评论
    3 个回答

    可看注释
    在a行代码时,test引用和堆内存如下:test指向123
    test -> {123}

    在b行代码是,引用和堆内存如下:test和a都指向123
    test -> {123} <- a

    在c行代码处,a引用地址改变,但是test引用地址没变,如下:
    test -> {123}
    a -> {abc}

    所以最终test输出 123

    public class Main {  
        void replace(StringHolder a) {
            a = new StringHolder("abc"); // c  
        }  
    
        static class StringHolder {  
            public StringHolder(String value) {  
                this.value = value;  
            }  
            public String value;  
        }  
    
        public static void main(String[] args) {  
            Main m = new Main();  
            StringHolder test = new StringHolder("123"); // a
            m.replace(test); // b
            System.out.println(test.value);
        }  
    }

      在这一句中, StringHolder test = new StringHolder("123");
      test是一个变量,指向 $ StringHoler("123") $ 。

      接下来 m.replace(test); 把 $test$ 传给 $a$ 。 $a$ 拿到了test的引用的拷贝,说白了就是让变量a指向value为123的StringHolder实例,或者说让a也指向 $ StringHoler("123") $。

      a = new StringHolder("abc"); 在replace方法里,又让 $a$ 指向了StringHolder("abc"),也就是value值为abc的StringHolder实例。

      那么问题来了,你让 replace方法里的局部变量 $a$ 指向别人(别的实例),关我 $test$ 啥事儿?

        replace方法更改了a的指向,此时随便怎么改都不会影响main方法里的test了。

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章