在调用t.change(t.str, t.ch);语句后,发生了这么几件事:1.change进入栈内存,拿到一块空间,在空间里创建了两个局部变量并根据传来的参数进行了初始化:
String str =t.str;----------------------注意,str是局部变量,这一步传过来的是个地址值。
char[] ch = t.ch;---------------------同样,ch也是局部变量,接收到的也是个地址。
2.执行chang方法里的语句,首先执行str = "test.ok";此时,这个动作其实是把值赋给了局部变量str,并没有改变t.str的值。这时,两个局部变量的值变成了这样
String str = "test.ok";----------------------注意,str是局部变
char[] ch = t.ch;---------------------同样,ch也是局部变
3.然后执行ch[0] = 'g';由于是按地址引用,所以会改变t.ch[0]的值,后面两个元素的值不变。
4.change执行return,回到main方法,然后接着执行下面的语句!
----------------------------------啦啦啦,我是分割线-----------------------------------------------------------------------------------------
解决方案一:
换个变量名,比如这样
- class Test {
- String str = new String("good");
- char[] ch = { 'a', 'b', 'c' };
- public static void main(String[] args) {
- Test t = new Test();
- t.change(t.str, t.ch);
- System.out.println(t.str);
- System.out.println(t.ch);
- }
- public void change(String hehe, char ch[]) {
- hehe = "test.ok";
- ch[0] = 'g';
- }
- }
复制代码 解决方案二(推荐):
使用this关键字,用于和局部变量区分!
- class Test {
- String str = new String("good");
- char[] ch = { 'a', 'b', 'c' };
- public static void main(String[] args) {
- Test t = new Test();
- t.change(t.str, t.ch);
- System.out.println(t.str);
- System.out.println(t.ch);
- }
- public void change(String str, char ch[]) {
- this.str = "test.ok";
- ch[0] = 'g';
- }
- }
复制代码
|