小天才恒恒 2022-10-31 14:16 采纳率: 100%
浏览 13
已结题

有没有大会画这个内存解析

img

img


我画的应该有问题

我的问题是这个

我想问 一个字符串型变量作为形参 去接收一个字符串型变量
然后在方法中 对形参这个字符串型变量做出改变 我知道会重新在常量池中造一个字符串 但是 为什么在主方法中 调用原本的字符串型变量 还是能找到 原有的字符串
我想不通这个内存解析

  • 写回答

1条回答 默认 最新

  • 莪是男神 2022-10-31 16:06
    关注

    我来帮你分析一下main方法里的代码吧
    一、首先当代码执行到 StringTest ex = new StringTest(); 时,内存图是这样的:

    img

    注意:new String("good"); 会同时在字符串常量池和堆内存中创建对象

     
    二、然后,当执行到 ex.change(ex.str, ex.ch); 时,内存图是这样的:

    img

    注意:可以看到有两个 str 字符串,一个是属于 ex 类实例,一个是属于 change() 方法的,且都指向同一个内存区域

     

    三、当执行到System.out.print(ex.str + " and ");时,上面的 change() 方法已经执行完毕了,此时内存图是这样的:

    img

    注意:字符串是不可被修改的,所有对字符串的修改都会产生一个新的字符串。且又由于不是同一个变量,所以这里 change() 方法只是改变了自身 str 字符串的地址,使其指向了字符串常量池中的 "test ok"。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 11月8日
  • 已采纳回答 10月31日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 eNSP中防火墙的使用
  • ¥15 不能对数据库增删改但是可以查询
  • ¥15 在触控设备上启动TabTip.exe打不开键盘界面,怎么用代码启动进程打开界面
  • ¥15 lvgl7.11怎么做出文字被选中的效果
  • ¥50 如何快速查看手机目标app的主要服务器ip
  • ¥15 (标签-stm32|关键词-m3)
  • ¥15 matlab中频率调制法代码的解读
  • ¥15 ceph的对象、块、文件相关问题求解答
  • ¥50 如果使用python进行ERA5 10米风场预报检验
  • ¥15 navicat解析mysql密码