菜鸟问题 请高手回答 谢谢谢谢

zxk123ha 2010-04-22 05:39:39
public class Example{
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}

请问结果是good and gbc 为什么啊? 这里string不是传来地址吗? 菜鸟问题 请高手回答 谢谢
...全文
140 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfq642773391 2010-04-23
  • 打赏
  • 举报
回复
String类用了不变模式了
zhouylf 2010-04-23
  • 打赏
  • 举报
回复
哈哈 String类比较特殊 它的实现不同与一般的类 当你试图改变对象状态时 它会自动创建一个对象副本给你 当它发现你没有改变对象 它就不会另创建新对象了
欢乐极客 2010-04-23
  • 打赏
  • 举报
回复
LZ该结贴了。。。
codingxm 2010-04-22
  • 打赏
  • 举报
回复
首先,str参数覆盖了成员变量Example.str,
另外Java里的方法参数都是按值传递的,
对方法
change(String str,char ch[])
的调用:
ex.change(ex.str,ex.ch);

可以理解为str参数是ex.str的一个副本,两者引用同一个String对象,
在change内部为str参数赋值,只是改变了str引用的对象而已。
也就是说,执行对str的赋值语句之前,是这样:
str -> String("good")
ex.str -> String("good")
执行赋值语句之后,变成:
str -> String("aaaaa")
ex.str -> String("good")
24K純帥 2010-04-22
  • 打赏
  • 举报
回复
学习。。
SealedBook 2010-04-22
  • 打赏
  • 举报
回复
传递给函数参数,是拷贝了一份引用值。
zdc951623 2010-04-22
  • 打赏
  • 举报
回复
作用域的问题,方法体里的变量值的任何操作,只做用在方法体里,不能改变全局变量的值
zxk123ha 2010-04-22
  • 打赏
  • 举报
回复
明白了 感谢楼上各位
youyouzhishen 2010-04-22
  • 打赏
  • 举报
回复
不好意思,上面的输出结果错了,更正为:
str = aaaaa
this.str = bbbbb
bbbbb and gbc
wutian4567268 2010-04-22
  • 打赏
  • 举报
回复
String传递的是值其他类传的是地址,只有String例外
youyouzhishen 2010-04-22
  • 打赏
  • 举报
回复

public class Example {
String str = new String("good");
char[] ch={'a','b','c'};

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

public void change(String str,char ch[]){
str = "aaaaa";
this.str = "bbbbb";
System.out.println("str = " + str);
System.out.println("this.str = " + this.str);
ch[0] = 'g';
}
}


输出:
str = aaaaa
this.str = bbbbb
good and gbc



str只是个临时变量,并没有代替成员变量。要是想改变成员变量,必须使用this指向它

cfd406635982 2010-04-22
  • 打赏
  • 举报
回复
这个问题是这样的
java中传的都是值,但是要知道传的什么值?
对于基本类型的话,就不说了
但是对于引用类型的话,传的值就是内存地址,所以你的str和ch都是一样的
但是String比较特殊,因为str="test ok", 相当于是str = new("test ok");所以你没有对原来的做出改变,这个知道不?
而ch的话,都是指向的同一块内存,你改变了ch[0],原来的肯定改变了
关于这个问题,你可以找找java参数传递的相关帖子。。
你看看就明白了。。
平淡面对 2010-04-22
  • 打赏
  • 举报
回复
String虽然是对象,不过却是特殊,String对象不可以改变。String类型的变量可以所指的String的对象可以改变,不过,本例中,由于本地变量名str与类的变量名相同,所以本地的变量覆盖了类的变量。也就是说,

str="test ok";


只更改了本地变量的值。如果要更改类的变量值,需要用


this.str="test ok";



欢乐极客 2010-04-22
  • 打赏
  • 举报
回复
这个问题有研究价值!

ex.str是Example中的字段,你用的new初始化,就是在内存中分配一个空间存储对象,并用str去指向它。

change这个函数中的str,是一个形参,在这里,你只是更改了形参str指向的对象,但这里不一定是在内存中分配对象,如果内存中已经存在"test ok"为内容的对象,则直接引用。如果没有,则分配个空间存储对象。

因此,change函数对类成员的str没影响。。

但是char数组ch,这是引用传递。。它记录了对象的地址,当修改ch[0]后,会将对象修改。。。因此,会是这种结果。。。
luozhangwen 2010-04-22
  • 打赏
  • 举报
回复
不是特别懂

肯定不是传址
String str = new String("good");
str = "str";
仔细看看这两个就知道为什么了
实际上这两个指向的不是一片类存.

62,619

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧