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
高手解答一下@!

解决方案 »

  1.   

    public void change(String str,char ch[]){ 
    str="test ok"; 
    ch[0]='g'; 

    这里的str与成员属性上的str不是同一个引用变量.
    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[]){ 
    this.str="test ok"; 
    ch[0]='g'; 

      

  2.   

    有人问过,String是不能通过方法改变的,方法中改变的只是String的一个拷贝,两个str指向不同的内存,改成StringBuffer可以,数组也可以,这时指向的是同一块内存,所以可以改变
      

  3.   

    str 是局部变量周期到方法结束
      

  4.   

    其实方法里的ch也不是成员属性里的ch.但是它们引用同个对象.但这里的对象是同一个了.
    成员属性一个引用.方法的参数里也有一个引用.
    在方法里,改了参数的引用的,但并没有改变它原来所引用的对象.
    在方法,通过ch引用,改变了它所引用的对象.String a = new String("aaa");String b = a;a和b是不同的引用变量.但是它们引用同一个对象,就是刚才创建的那个.
      

  5.   

    不一样是操作的String对象不一样。。
    如果你想修改的效果。。可以把前面的对象作为值传递进来。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, ex.ch);
    System.out.print(ex.str + " and ");
    System.out.print(ex.ch);
    } public void change(Example exp, char ch[]) {
    exp.str = "test ok";
    ch[0] = 'g';
    }
    }
      

  6.   

    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 , ex.ch); 
            System.out.print(ex.str + " and "); 
            System.out.print(ex.ch); }     public void change(Example exp, char ch[]) { 
            exp.str = "test ok";
            ch[0] = 'g'; 
        } 
    } 运行结果 test ok and gbc
      

  7.   


    String已经定义了,它只是个应用,所以它的值是不会改变的,但是数组就不同了
      

  8.   

    这里的str与成员属性上的str不是同一个引用变量.
    String中存放的是真实的值。
    数组可以是因为数组存放的是地址。
      

  9.   

    你的test ok只付给了方法中的临时变量,没有改变原始String的值
      

  10.   

    public void change(String str,char ch[]){ 
    this.str="test ok";     // str是String类型的变量,这句话相当于在堆中另外申请一片空间存放"testok"; 而str在堆中的原来的值没改变------相当于String类型的值是不能改变的    ch[0]='g'; //数组的长度不能改变,但是他其中的值是可以改变的。

      

  11.   

    public void change(String str,char ch[])
    在我看,调用change(String str,char ch[]);的过程实参把数组的引用给了ch,也就是说ch指向了实参,因此ch改变,实参也就跟着改变
      

  12.   

    ex.change(ex.str,ex.ch); 
    public void change(String str,char ch[]){ 
    str="test ok"; 
    ch[0]='g'; 

    其实理解方法有很多种,我倾向于这种理解:ex.change(ex.str,ex.ch);这句话调用change这个函数,并且将2个参数的值传进去,也就是说一开始public void change(String str,char ch[])中str指向字符串池中"good",注意此时已有2个引用指向"good"的,同样ch[]也相同。不同的是str="test ok"; 字符串池中新建个值为test ok的对象,此时str指向这个对象,但原来的那个引用并没有改变,还是指向原来的"good",而ch[]和字符串池是不同的,他将他所指向的对象的ch[0]改变之后,原来的对象也就改变了,所以这个知识还需要了解字符串池的相关知识。