public class B {
String str=new String("abc");
char p[]={'a','b'};
public void change(B b){
b.str="test";
b.p[0]='g';
}
public void change(String str,char p[]){
str="str";
p[0]='k';
}
public static void main(String[] args) {
B b=new B();
b.change(b);
System.out.println(b.str+"--"+b.p[0]);
b.change(b.str, b.p);
System.out.println(b.str+"--"+b.p[0]);
}
}
结果为 :
test--g
test--k
求解释!
当调用change(String str,char p[])时,只是传了一个String的引用,成员变量str的值不改变
而你输出的是b.str,所以是test
char[]p随着你值的改变而改变
这里的str = "str" 的语义应该是新new String("str")对象,然后把str指向这个堆里面新增的"str"对象,已经不是传进来的引用了。
change(String str,char p[]) 调用这个方法的时候 传入的str你可以理解为Cope了一个b.str ,所以方法里的str变化不会影响b.str
public void change(String str,char p[]){
str="str";
p[0]='k';
}str="str" 只是改变了str(参数里申明的str)这个String对象的引用,并没有改变传进来的String对象的值
public void change(String str,char p[]){
str="str";//如果是b.str = “str”,那就改变
p[0]='k';
}
是引用。是引用的Cope , 方法中的str引用开始是和b.str指向一处的。后来方法中的str指向变到"str"啦。