String类的特性
问题描述
下面程序运行的结果是什么?尝试画出内存布局图。
1 | public class StringExercise02 { |
解决方法
一、方法执行时分析
1 | public void change(String str,char ch[]) { |
在执行代码①处时,ex.str 和 ex.ch 被传递给change方法,由于二者均为引用数据类型(数组类型和String类型),因而传入 change 方法时,会直接使得形参 str 指向ex对象的 str 和 ch 属性在堆中的地址,后开始执行该方法:
由于代码②处将字符串常量赋值给 str,因而会在常量池中创建 “java” 对象,并将 str 指向该处于常量池中的对象,因而上述图中的虚线断裂,箭头重新指向常量池中的 “java” ;
由于 ch 并未重新赋值,而是直接在原来的基础上对原数组进行修改,因而ch的指向不改变,但是该数组的内容发生改变。
二、方法执行后分析
由于在执行该方法时 JVM 会在栈中创建 change 栈,在该方法执行完毕之后进行销毁,因此该方法的形参 str 和 ch 均被销毁,并返回主栈。此时 ex 对象的 str 属性并未改变,为 “lxb” ;ch 属性则发生变化,变为 “hava” ,因而最终输出为 lxb and hava.