TS败类 2020-01-26 00:30 采纳率: 0%
浏览 150
已采纳

关于String不可变对象的问题求助

昨天复习之前栈和堆课本时候偶然看到了一段代码在1jdk.8运行了。下面这段代码为什么change方法没有改变s1,s2,传进去的是引用对象,让s1,s2变量重新指向了新的对象或者常量池中的内容难道不应该被改变吗?
这块不太明白,我开始搞不清楚常量池是在栈还是在堆,因为离开方法区可能销毁对应的栈,所以为了确认我又改成了对象,
一定在堆中了,发现结果任然不变。希望有老师能给我点明白哪里想错了,谢谢老师。

代码1
public class Learn04 {

    public static void main(String args[]){

        String s1 = new String("abcd");
        String s2 = "asdfghjkl";
        System.out.println(s1+", "+s2);
        change(s1,s2);
        System.out.println(s1+", "+s2);

    }

    static void change(String s1,String s2){
        s1 ="123456";
        s2 ="000000";
        System.out.println(s1+", "+s2);

    }
}
代码2
public class Learn04 {

    public static void main(String args[]){

        String s1 = new String("abcd");
        String s2 = "asdfghjkl";
        System.out.println(s1+", "+s2);
        change(s1,s2);
        System.out.println(s1+", "+s2);

    }

    static void change(String s1,String s2){
        s1 =new String("123456");
        s2 =new String("000000");
        System.out.println(s1+", "+s2);

    }
}

实验结果:
图片说明

  • 写回答

1条回答 默认 最新

  • 皮卡qiu~ 2020-01-26 18:35
    关注

    1.String类型作参数传递的时候,实参的值不会改变,这里是原因:http://www.imooc.com/article/288336
    2.关于字符串创建对象,直接赋值,栈,堆,方法区和常量池的关系,这里比较详细:https://www.bilibili.com/video/av37614313?p=328

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上