String类的特性
Lucas-Lxb

问题描述

​ 下面程序运行的结果是什么?尝试画出内存布局图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StringExercise02 {
String str = new String("lxb");
final char[] ch = {'j','a','v','a'};
public void change(String str,char ch[]) {
str = "java";
ch[0] = 'h';
}

public static void main(String[] args) {
StringExercise02 ex = new StringExercise02();
ex.change(ex.str,ex.ch); //①
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
}
}

解决方法

一、方法执行时分析

1
2
3
4
public void change(String str,char ch[]) {
str = "java"; //代码②
ch[0] = 'h'; //代码③
}

​ 在执行代码①处时,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.

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务