A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jarc 高级黑马   /  2016-9-23 13:51  /  648 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class  Test{
        public static void main(String[] args) {
                String s1 = "java";
                String s2 = "hello";
                method_1(s1,s2);
                System.out.println(s1+"...."+s2); //java....hello
               
                StringBuilder s11 = new StringBuilder("java");
                StringBuilder s22 = new StringBuilder("hello");
                method_2(s11,s22);
                System.out.println(s11+"-----"+s22); //javahello-----hello
        }
        public static void method_1(String s1,String s2){
                s1.replace('a','k');
                s1 = s2;
        }
        public static void method_2(StringBuilder s1,StringBuilder s2){
                s1.append(s2);
                s1 = s2;
        }
}
为什么输出不一样?都是引用类型的值传递啊?

2 个回复

正序浏览
{:2_30:}   不知道,共同学习一下。。
回复 使用道具 举报
我认为在方法1中,对象调用replace 方法并不会对对象本身产生影响,然后s1 = s2 这个动作会把s1 指向 s2地址,但是在方法弹栈后就,指向就会消失,所以不会影响结果。
但是StringBuilder 的append 方法不同,使用它加入字符串会将参数追加到它本身后面,然后s1= s2这个赋值操作同上,会在方法弹栈后指向会消失。
仅个人观点,要是有大牛给更权威解释更OK
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马