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

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

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?