下面程序运行的结果是什么
public class Test1{
String str = new String("haha");
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){
Test1 ex = new Test1();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and");
System.out.print(ex.ch);
}
}
我们一起来分析下 这次使用画图来处理
先执行main方法的第一条语句
1.Test1 ex = new Test1();
下面是执行完该语句的jvm内存
现在执行第二条语句
2. ex.change(ex.str,ex.ch);
执行该语句会创建一个新的栈(执行方法会创建一个新的栈)
由于 它们都是引用类型所以是地址传递 ,我们先画出 public void change(String str,char ch[])
2.1 在执行 str ="java";
这条语句 会先在常量池中查找 有没有 "Java",没有那么会在常量池内添加一个 "java"
显然 这里并没有 ,所以在常量池 添加了一个 "java"
相当于ch指向的地址从[0x33] 变成了 [0x55](当然是 change栈里面的ch改变了指向)
然后 我们执行
2.2 ch[0] = 'h';
将原来数组 ch下标为0的元素'j' 修改成了'h'
到此change栈执行完毕
但是 但是 但是 方法执行完毕会关闭 change栈!!!!!
我们现在执行main栈的第三条语句
3.System.out.println(ex.str+"and");
通过下图知道 ex.str 指向String对象[0x22],期内的value指向[0x44]"haha"
所以输出: hahaand
现在执行第四句话
4.System.out.print(ex.ch);
还是通过上图知道 ex.ch 是指向的 char对象[0x33] 其内字符串 "hava"
5. 所以 最后输出 :
hahaandhava
so 你答对没有啊?
总结: 数组,字符串不可变 (也就是相同的一个地址里面只能有一个 数组,字符串)
执行一个方法会开辟新栈,执行完毕会回到调用处,并关闭新栈。