public class Demo {
String str = "aa";
char[] ch = {'a','b'};
public void test(String str, char[] ch){
str = "bb";
ch[0] = 'c';
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.test(demo.str, demo.ch);
System.out.println(demo.str);
System.out.println(demo.ch);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f297f487d01961cc666136fdba0c762f.png)
- 方法区加载demo类信息
- main方法入栈
- 初始化demo对象,查看常量池是否有对应常量“aa”,‘a’,‘b’,有则复制一份复制给str和ch,没有则在常量池创建“aa”,‘a’,'b’对象,并复制一份给str和ch
- test方法入栈,传入值’aa’, {‘a’,‘b’},即test(‘aa’, {‘a’,‘b’}),此时相当于执行str = ‘aa’,ch={‘a’,’'b},此时str指向 常量池的’aa’,ch指向 demo对象的ch所指向的数组
- 执行test方法体,str = ‘bb’,ch[0] = c。此时str指向 常量池的’bb‘,对全局变量str不造成影响,test方法执行完毕之后就会局部变量被销毁;而ch指向了 demo对象的ch所指向的数组,是真正在堆内存中的对象。
- 因此最终的结果为demo.str = ‘aa’, demo.ch = [‘c’, ‘b’]