public class Example {
String str = "hello,java";
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.println(ex.str+"....");
System.out.println(ex.ch);
请问,为什么结果 ex.ch变成了GBA而ex.str却还是 "hello,java"呢?打印结果是
hello,java....
Gbcjava引用变量
String str = "hello,java";
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.println(ex.str+"....");
System.out.println(ex.ch);
请问,为什么结果 ex.ch变成了GBA而ex.str却还是 "hello,java"呢?打印结果是
hello,java....
Gbcjava引用变量
更确切的说他们都是引用,引用不代表对象,但是通过引用可以操作对象。
str = "test ok";这句是对形参进行从新复制,学过c语言都知道,这是不可能改变实参的值的,因为java全部都是值传递,而不是对象传递,你传给函数一个实参,其实只是传递了实参的引用。
ch[0]='G';就不一样了,这里ch指向了实参引用的对象,所以通过对引用的操作会影响到对象的状态,如果这里改成ch=new String[]{'G','b','c'};将改变不了实参的值,输出依然是abc
对方法内的str重新赋值,使其指向"test ok",而对象的成员变量ex.str不会因此受影响,仍然指向"hello,java".我觉得理解这个问题的关键在于方法外部和方法内部两个引用变量的认识,外面的也就是实参,方法内的是形参。而字符数组的元素,是基本类型数据,基本类型数据不存在引用,它的赋值操作也就不是引用的重定向,而是直接对数据存放地址中的值做改变。不知大家觉得对不。
str1 ="abc";
str2 = str1;
str2 ="bcd";这样,str1="abc";
LS那些说值传递和引用传递的什么意思呢。
这里全部都是对象了,String ,数组 都是对象,都是传递引用了吧。
!
char[] 是指向指针的指针change里改为
ch ={'e','f','g'}; 输出也不会变