我画的应该有问题
我的问题是这个
我想问 一个字符串型变量作为形参 去接收一个字符串型变量
然后在方法中 对形参这个字符串型变量做出改变 我知道会重新在常量池中造一个字符串 但是 为什么在主方法中 调用原本的字符串型变量 还是能找到 原有的字符串
我想不通这个内存解析
我来帮你分析一下main方法里的代码吧
一、首先当代码执行到 StringTest ex = new StringTest();
时,内存图是这样的:
注意:new String("good");
会同时在字符串常量池和堆内存中创建对象
二、然后,当执行到 ex.change(ex.str, ex.ch);
时,内存图是这样的:
注意:可以看到有两个 str 字符串,一个是属于 ex
类实例,一个是属于 change()
方法的,且都指向同一个内存区域
三、当执行到System.out.print(ex.str + " and ");
时,上面的 change()
方法已经执行完毕了,此时内存图是这样的:
注意:字符串是不可被修改的,所有对字符串的修改都会产生一个新的字符串。且又由于不是同一个变量,所以这里 change()
方法只是改变了自身 str
字符串的地址,使其指向了字符串常量池中的 "test ok"。