黑马程序员技术交流社区
标题:
一个小问题,谁解释下
[打印本页]
作者:
a844468138
时间:
2014-1-6 12:20
标题:
一个小问题,谁解释下
本帖最后由 a844468138 于 2014-1-6 20:23 编辑
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[]){
str="test.ok";
ch[0]='g';
}
}
为什么结果会是
good
gbc
为什么str的值没变,而ch的值会变
作者:
猎鹰tianya
时间:
2014-1-6 13:08
在调用
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';
}
}
复制代码
作者:
七录斋
时间:
2014-1-6 13:09
你的change()方法改变的只是传入的参数的值,而内存中的String的值并没有改变,而为什么ch[0]的值变了呢?那是因为你传入的是t.ch,它本身是个指针,指向的就是内存中的ch数组,所以方法中对它做的改变在内存中是生效的.你可以试着这样改写代码:
class Test{
String str="good";
char[] ch={'a','b','c'};
public static void main(String[] args){
Test t=new Test();
t.change(t);
System.out.println(t.str);
System.out.println(t.ch);
}
public void change(Test t){
t.str="test.ok";
t.ch[0]='g';
}
}
个人拙见,仅供参考,如有错误,还望赐教。
作者:
七录斋
时间:
2014-1-6 13:14
沙发上的第一个方案是不行的,跟方法的参数名无关,第二个方案确是一个挺不错的方法。
作者:
L_t
时间:
2014-1-6 13:31
package com;
class Test1{
String str=new String("good");
char[] ch={'a','b','c'};
/*public static void main(String[] args){
Test1 t=new Test1();
t.change(t.str,t.ch);
System.out.println(t.str);
System.out.println(t.ch);
}*/
/*public void change(String str,char ch[]){
str="test.ok";
ch[0]='g';
}
}*/
//为什么str的值没变,而ch的值会变?因为String是类类型,是引用类型,初始化值不变,变的是变量。
//那么如果你想打印"test.ok";需要这样做
public static void main(String[] args){
Test1 t=new Test1();
t.change(t.str,t.ch);
System.out.println(t.ch);
}
public void change(String str,char ch[]){
String s ="test.ok";
ch[0]='g';
System.out.println(s);
}
}
复制代码
作者:
52Pig
时间:
2014-1-6 13:32
你的str 局部变量 不会影响全局的
this.str="test.ok"这样就会变了!!!
作者:
黄晓鑫
时间:
2014-1-6 13:46
因为字符串是不可变的 而数组的元素是可以重新赋值的
作者:
tuanjie
时间:
2014-1-6 20:06
遇到引用传递的情况,如果不容易一下看明白,可以自己尝试画图,那样可以帮助你快速理解
引用传递.gif
(32.21 KB, 下载次数: 6)
下载附件
2014-1-6 20:04 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2