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';
}
}请问结果是good and gbc 为什么啊? 这里string不是传来地址吗? 菜鸟问题 请高手回答 谢谢

解决方案 »

  1.   

     不是特别懂
     
    肯定不是传址
    String str = new String("good");
           str = "str";
    仔细看看这两个就知道为什么了
    实际上这两个指向的不是一片类存.
      

  2.   

    这个问题有研究价值!ex.str是Example中的字段,你用的new初始化,就是在内存中分配一个空间存储对象,并用str去指向它。change这个函数中的str,是一个形参,在这里,你只是更改了形参str指向的对象,但这里不一定是在内存中分配对象,如果内存中已经存在"test ok"为内容的对象,则直接引用。如果没有,则分配个空间存储对象。因此,change函数对类成员的str没影响。。但是char数组ch,这是引用传递。。它记录了对象的地址,当修改ch[0]后,会将对象修改因此,会是这种结果
      

  3.   

    String虽然是对象,不过却是特殊,String对象不可以改变。String类型的变量可以所指的String的对象可以改变,不过,本例中,由于本地变量名str与类的变量名相同,所以本地的变量覆盖了类的变量。也就是说,str="test ok";
    只更改了本地变量的值。如果要更改类的变量值,需要用
    this.str="test ok";
      

  4.   

    这个问题是这样的
    java中传的都是值,但是要知道传的什么值?
    对于基本类型的话,就不说了
    但是对于引用类型的话,传的值就是内存地址,所以你的str和ch都是一样的
    但是String比较特殊,因为str="test ok", 相当于是str = new("test ok");所以你没有对原来的做出改变,这个知道不?
    而ch的话,都是指向的同一块内存,你改变了ch[0],原来的肯定改变了
    关于这个问题,你可以找找java参数传递的相关帖子。。
    你看看就明白了。。
      

  5.   


    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 = "aaaaa";
    this.str = "bbbbb";
    System.out.println("str = " + str);
    System.out.println("this.str = " + this.str);
    ch[0] = 'g';
    }
    }
    输出:
    str = aaaaa
    this.str = bbbbb
    good and gbcstr只是个临时变量,并没有代替成员变量。要是想改变成员变量,必须使用this指向它
      

  6.   

    String传递的是值其他类传的是地址,只有String例外
      

  7.   

    不好意思,上面的输出结果错了,更正为:
    str = aaaaa
    this.str = bbbbb
    bbbbb and gbc
      

  8.   

    首先,str参数覆盖了成员变量Example.str,
    另外Java里的方法参数都是按值传递的,
    对方法change(String str,char ch[])的调用:
    ex.change(ex.str,ex.ch);
    可以理解为str参数是ex.str的一个副本,两者引用同一个String对象,
    在change内部为str参数赋值,只是改变了str引用的对象而已。
    也就是说,执行对str的赋值语句之前,是这样:
    str -> String("good")
    ex.str -> String("good")
    执行赋值语句之后,变成:
    str -> String("aaaaa")
    ex.str -> String("good")
      

  9.   

    哈哈 String类比较特殊 它的实现不同与一般的类  当你试图改变对象状态时 它会自动创建一个对象副本给你 当它发现你没有改变对象 它就不会另创建新对象了