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

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

img

img


我画的应该有问题

我的问题是这个

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

  • 写回答

1条回答 默认 最新

  • 莪是男神 2022-11-01 00: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月9日
  • 已采纳回答 11月1日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用