求解

romantic11000 2010-08-11 07:33: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.println(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}

输出结果为什么会是good and gbc
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason69181 2010-08-11
  • 打赏
  • 举报
回复
public void print(char[] s)打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。

参数:
s - 要打印的字符数组
抛出:
NullPointerException - 如果 s 为 null


以上是api的参考文档.多查api


bekeer 2010-08-11
  • 打赏
  • 举报
回复
String类的对象是不可以改变的 要想改变字符串的值就得用StringBuffer类
String对象是保存在内存中的 StringBuffer是在缓存中
至于String的值不可变忘了 好像有点复杂 暂时先死记住就行了 等自己的修炼的差不多了也就自然明白了
怪人伽利略 2010-08-11
  • 打赏
  • 举报
回复
第一个str已经是一个常量了,后面传递给函数不可能改变一个常量的值了,所以只能是原来的值了
lliiqiang 2010-08-11
  • 打赏
  • 举报
回复
引用值传递是指向对象的信息。这样虽然可以共享资源,但是如果你替换了对象就不能共享资源了.

例如你注册了一个网站,并有了相应的url.你将这个url告诉了你的朋友,那么以后你只需将信息发布到网站上,而你的朋友可以通过url找到你的网站从而看到你的新的信息。这就是引用值传递。其中的url就是引用值信息.但是如果你的网站的url变了,那么你的好友就看不到你的信息了.这就需要引用传递了,即将所有的原来的url重新定向到最新的url中
sky123123 2010-08-11
  • 打赏
  • 举报
回复
还是先搞清楚全局变量和局部变量的作用域吧 注意看“{ }”
茫茫大海 2010-08-11
  • 打赏
  • 举报
回复
不是1楼回答的那样,这就是Java中的参数传递,等有时间了给你详细说说!现在上班呢?
keeya0416 2010-08-11
  • 打赏
  • 举报
回复
java里都是值传递
故方法里更改的只是参数的副本,这个是不影响参数本身的值的
当参数是数组的时候,其实传进来的是那个数组在内存中的地址的值的副本
相当是两个引用的值相同,指向同一个内存空间,那样是可以通过这个地址去修改内存中的值的
染指黄昏 2010-08-11
  • 打赏
  • 举报
回复
传参问题 是值还是引用 现在也没搞清楚 来学习下
wzx168love 2010-08-11
  • 打赏
  • 举报
回复
楼主change方法里的String str,并不是上面定义的类变量str;而是一个重新定义的局部变量,它们两者在不同的内存中;要改变原有类变量的值,在其它方法中要加上this;在这里this可以理解为本类的!固楼上更改是正确的...
njskater 2010-08-11
  • 打赏
  • 举报
回复
Sorry上面说的不完全,又在网上研究了一下,java是pass by value,但是对于object他是pass reference by value.就是说对于object,他传进的实际上是原对象的地址的值。所以对于mutable object你可以更改object内部的值,但是不能更改原对象的地址的值,因为这个对象的reference是pass by value而已。
hardycheng 2010-08-11
  • 打赏
  • 举报
回复

public class Example {

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


public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}

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


上面是你的代码,再看一下我改完之后的代码:

public void change(String str, char ch[]) {
this.str = "test ok";
ch[0] = 'g';
}


这样才能把 ex的str的值改变。

这里为什么你的change方法 能改变 ex的 ch 而不能改变 str,

你可以参考一下 这个帖子:http://topic.csdn.net/u/20100716/15/db8ffab6-cc0c-4f04-89c5-a2e49d7ece44.html , 我当时也有和lz有类似的困惑。
njskater 2010-08-11
  • 打赏
  • 举报
回复
String是immutable object, array是mutable object
waveBreaking 2010-08-11
  • 打赏
  • 举报
回复
楼主代码的问题在于全局变量与局部变量同名了,

在两种变量同名的情况下,局部变量在它的领域中式拥有优先权的,

所以
str = "test ok";
其实是赋值给了局部变量

另文JAVA中的参数传递都是值传递

所以两个str的地址是不同的

所以就造成了这样的输出
kondor 2010-08-11
  • 打赏
  • 举报
回复
个人认为因为String是final属性,所以它的值是不可变的,如果改成StringBuffer的话就没问题了
ybj_123 2010-08-11
  • 打赏
  • 举报
回复

public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}

值传递传递的是值的拷贝,所以传过去的值被改变也不会改变原来的值。该例中的“str”就是一个值的拷贝。

public void change(String str, char ch[]) {
this.str = "test ok";
ch[0] = 'g';
}


这里的"Str"加了this之后表示的是全局变量.

62,614

社区成员

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

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