![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
高手来看看这个例子!!
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 不好意思 我打错了 展开
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 不好意思 我打错了 展开
6个回答
展开全部
你这里输出的应该是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结果仍然不会变,还是会被修改。。
这里注意局部变量会覆盖类成员变量,还有就是原始类型的特殊性。。
首先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结果仍然不会变,还是会被修改。。
这里注意局部变量会覆盖类成员变量,还有就是原始类型的特殊性。。
展开全部
这就是传值调用与传址调用的区别。
虽说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';
}
}
虽说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';
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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类,进行值传递.
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有些人不要误人子弟,JAVA中根本就不存在址传递这个概念!!!学过C的人都知道,址传递传进方法的是一个内存地址,对这个地址做任何改变都会直接影响到实参....
Integer a = new Integer(1);
void change(Object a){
a = new Integer(2);
}
试问,执行change(a)后a的值改变了吗?(这是你们所说的址传递吧)
大家都知道没有...........
没学过C总是对址传递的概念搞不清楚.....
址传递传递的是内存地址,如果内存地址中放入新的数据,那实参就变成了新的数据,如果上面是址传递,那a应该为 new Integer(2) 了,事实上大家都知道不是....
请注意用词..............
Integer a = new Integer(1);
void change(Object a){
a = new Integer(2);
}
试问,执行change(a)后a的值改变了吗?(这是你们所说的址传递吧)
大家都知道没有...........
没学过C总是对址传递的概念搞不清楚.....
址传递传递的是内存地址,如果内存地址中放入新的数据,那实参就变成了新的数据,如果上面是址传递,那a应该为 new Integer(2) 了,事实上大家都知道不是....
请注意用词..............
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在java中,字符串和字符数组都是由其名称引用的,传递时只会把这个引用的地址拷贝给目的地,使它也指向这个字符串或者数组,对参数引用关系的修改当然不会影响原引用关系,但是对其指向的东西的内容的修改却能反映到实体中…使用Buffer也能改内容!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询