我画的应该有问题
我的问题是这个
我想问 一个字符串型变量作为形参 去接收一个字符串型变量
然后在方法中 对形参这个字符串型变量做出改变 我知道会重新在常量池中造一个字符串 但是 为什么在主方法中 调用原本的字符串型变量 还是能找到 原有的字符串
我想不通这个内存解析
我的问题是这个
我想问 一个字符串型变量作为形参 去接收一个字符串型变量
然后在方法中 对形参这个字符串型变量做出改变 我知道会重新在常量池中造一个字符串 但是 为什么在主方法中 调用原本的字符串型变量 还是能找到 原有的字符串
我想不通这个内存解析
我来帮你分析一下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"。