下面的代码运行结果是good and gbc,我不明白,请指教,或者能否帮忙画个内存图说说啊
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';
}
}
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';
}
}
//6.这里的ch[0]= g这里跟着改动
char[] ch = {'a','b','c'};
public static void main(String[] args) {
Example ex = new Example();
//1.程序执行.调用change方法,传进去两个有值的参数,一个是good.一个 {'a','b','c'};
ex.change(ex.str,ex.ch);
//7.结果输出调用成员变量str值是GOOD,ch的值是gbc
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
//2.方法启动,接受参数值(good,{'a','b','c'});
public void change(String str,char ch[]){
//3.定义一个str的字符变量并赋值为test ok;
str = "test ok";
//4.修改数组第一个元素的内容.a改为g
//5.因为数组是引用变量.所以这里改动那么全局改动了;
ch[0]='g';
}
}
这里主要考核你对引用传递的和值的传递的理解!
你说的结果可能认为是 test ok and gbc
如果要是这样的结果那么必须改掉
//1加一个关键字 this 这样就将值"test ok" 传递给成员变量;
public void change(String str,char ch[]){
this.str = "test ok";
ch[0]='g';
}
什么样的是引用传递?什么样的是值传递啊?
就可以了。
String 是一个特殊的吧
下面是一个图吗?怎么不能显示啊?是什么?
public class Example {
String str = new String("good"); //首先在堆中创建一个对象(“good”),在栈创建一个32位引用(Example.str)指向堆中的对象(“good”)
char[] ch = {'a','b','c'}; //常量区:创建a,b,c三个;栈中存引用ch指向这三个
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指向Example.str;常量直接传值过去
str = "test ok";//创建了“test ok”,修改了str的引用到“test ok”,并没有修改Example.str的引用,所以当你System.out.print(ex.str+" and ");还是Example.str引用指向的“good”对象
ch[0]='g'; //由于传的是值,直接改变值;
}
}
其他引用类型都是引用传递
包装类及String值传递的原理是:
包装类的值操作实际上都是通过对其对应的基本类型操作而实现
String也一样,它实际上是对char的值的操作,为值传递
关键在于:Java中的所谓的引用,其本身也是一个值。所以,从这点上看,Java中没有引用传递,只有值传递。楼主这个例子和String一点关系都没有。String和数组一样,都是对象,传递进方法的都是引用。
但注意,这个引用它本身是一个值。方法得到了这个值的一个副本,所以,方法内的引用和方法外的引用是两个独立存在的值。你想通过改变方法内的引用来影响方法外的引用,那是永远办不到的。
但是,由于方法内的引用和方法外的引用指向的是同一个对象,所以当你改变方法内的引用所指向的对象时,实际上就是改变方法外引用所指向的对象。这就是为什么你可以在方法内改变方法外的那个数组。
有的是真正的值本身,而有的是地址值
那对于String来讲的话,传递的就是真正的值,无所谓引用的概念,所以只是作为参数传递给了方法,和外面的实际的值无关
而对数组来讲,传递的是地址值,方法内和方法外的引用指向同一个对象,方法内改变了所指向的对象,那实际就是改变了方法外的对象
就是这么理解吧?
java中所有参数传递,执行的都是引用传递。
看你怎么理解了~~
那对String,方法外和方法内的地址指向的不是同一个对象,就是说地址不同
但是,那是为什么呢?
ch[0]='g';你这两句执行的操作是不一样的,第一句是让str指向另一个地址,第二句你是利用ch指向的地址改变了数组本身。
呵呵 Dan彻底无语