高手来看看这个例子!!

publicclassExample{Stringstr=newString("good");char[]ch={'a','b','c'};publicstaticvoi... 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 ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
请问这个程序为什么输出good and abc??为什么输出这个结果而不是test ok and g
是good and gbc 不好意思 我打错了
展开
 我来答
rendong237
推荐于2017-09-15 · TA获得超过110个赞
知道答主
回答量:53
采纳率:0%
帮助的人:0
展开全部
你这里输出的应该是good and gbc
首先java里确实是传值,不是传引用。
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
你这里的str="test ok"只是修改的局部变量str,不是类的成员变量。类的成员变量并没有被修改,如果你把参数里的str换成str1你在试试看,输出的结果就是test ok 了。。

关于这个你可以做个小测试,在方法里声明一个变量,这个变量的名字和类的成员变量同名,然后你赋值。会发现类成员变量不会被修改的。

为什么char[] ch里的东西会被修改呢?
因为char是原始类型,也就是本身不是对象,是直接放在栈里的。也就是说传递的就是本身的地址。所以结果里是被修改了的。。
你可以把char换成int来测试,结果还是会被修改,因为int也是原始类型
还有个测试,你可以把参数里的ch变量换成ch1结果仍然不会变,还是会被修改。。

这里注意局部变量会覆盖类成员变量,还有就是原始类型的特殊性。。
bearfig
2007-12-03 · TA获得超过877个赞
知道大有可为答主
回答量:1074
采纳率:0%
帮助的人:1112万
展开全部
这就是传值调用与传址调用的区别。
虽说java中没有了指针,但是实际操作的时候是依赖指针进行的。这里实际是传值调用,所以原数据不发生变化。
这样改一下肯定可以变化:

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();
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(){
str="test ok";
ch[0]='g';
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
TianjunFF
2019-03-11
知道答主
回答量:4
采纳率:0%
帮助的人:2744
展开全部
public class Test {
String str = new String("good");
char[] ch = {'a','b','c'};
Map map = new HashMap();


public static void main(String[] args) {
Test test = new Test();
test.map.put("1","11");
test.change(test.str, test.ch,test.map);
System.out.print(test.str + " and ");
System.out.print(test.ch);
System.out.print(" " + test.map.get("1").toString());
// good and gbc 22
}

public void change(String str, char[] ch,Map m) {
str = "test ok";
// String 是final类,这里重新new了一个String,类的成员变量没有发生改变.
ch[0] = 'g';
// char 这个是基本类型,存在栈中,直接修改本身.
m.put("1", "22");
// map是引用类型,但不是final类,进行值传递.
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
EVAyoung
2007-12-04 · TA获得超过140个赞
知道答主
回答量:77
采纳率:0%
帮助的人:0
展开全部
有些人不要误人子弟,JAVA中根本就不存在址传递这个概念!!!学过C的人都知道,址传递传进方法的是一个内存地址,对这个地址做任何改变都会直接影响到实参....

Integer a = new Integer(1);
void change(Object a){
a = new Integer(2);
}

试问,执行change(a)后a的值改变了吗?(这是你们所说的址传递吧)
大家都知道没有...........

没学过C总是对址传递的概念搞不清楚.....
址传递传递的是内存地址,如果内存地址中放入新的数据,那实参就变成了新的数据,如果上面是址传递,那a应该为 new Integer(2) 了,事实上大家都知道不是....

请注意用词..............
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
洪依白0F0
2007-12-04 · 超过21用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:34万
展开全部
在java中,字符串和字符数组都是由其名称引用的,传递时只会把这个引用的地址拷贝给目的地,使它也指向这个字符串或者数组,对参数引用关系的修改当然不会影响原引用关系,但是对其指向的东西的内容的修改却能反映到实体中…使用Buffer也能改内容!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式