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
求解释!

解决方案 »

  1.   

    当调用change(B b)时,str的值该为了test
    当调用change(String str,char p[])时,只是传了一个String的引用,成员变量str的值不改变
    而你输出的是b.str,所以是test
    char[]p随着你值的改变而改变
      

  2.   

    我不明白的是我传的确实是String的引用,但是这个引用也是指向B的这个对象的啊,所以我觉得b.str的值应该也会变啊。帮忙解释下。
      

  3.   


    这里的str = "str" 的语义应该是新new String("str")对象,然后把str指向这个堆里面新增的"str"对象,已经不是传进来的引用了。
      

  4.   

    你是说str = "str"另外在创建一个对象,然后str指向了这个对象?为什么呢?
      

  5.   

    -----楼主: 方法调用时的引用传递和值传递。很基本的东西呀  
    change(String str,char p[]) 调用这个方法的时候 传入的str你可以理解为Cope了一个b.str ,所以方法里的str变化不会影响b.str    
      

  6.   

    java里引用传递是传递引用的拷贝。不是这个对象本身
      

  7.   

    传递的确实是引用啊,但是虽然引用变了但是引用指向的地方没有变啊 ,帮忙解释下,小弟初学JAVA。
      

  8.   

    String 在java中的声明是 final 的,所以无法改变它的值,我们所看到的改变只是修改了 String对象的引用。
    public void change(String str,char p[]){
     str="str";
     p[0]='k';
    }str="str" 只是改变了str(参数里申明的str)这个String对象的引用,并没有改变传进来的String对象的值
      

  9.   

    java中只有值传递,你了解一下值传递吧
      

  10.   


    public void change(String str,char p[]){
         str="str";//如果是b.str = “str”,那就改变
         p[0]='k';
    }
      

  11.   

    string类型的值是不可变的,而stringBuffer/stringBuilder的值是可变的
      

  12.   


    是引用。是引用的Cope , 方法中的str引用开始是和b.str指向一处的。后来方法中的str指向变到"str"啦。
      

  13.   

    String是常量,了解常量池就OK。