下面的代码运行结果是good and gbc,我不明白,请指教,或者能否帮忙画个内存图说说啊
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';
}
}

解决方案 »

  1.   

    先占个沙发,考察Sting类 和 数组覆盖。
      

  2.   

    是啊,我就是不明白,ex.change(ex.str,ex.ch); 不是已经将str的值改变了吗?为什么结果却没变呢?
      

  3.   

    很明显是change(String str,char ch[])参数str和成员变量重名了,你在执行那个方法的时候,只是把参数的值改变了。
      

  4.   

    public class Example { String str = new String("good"); 
    //6.这里的ch[0]= g这里跟着改动
    char[] ch = {'a','b','c'}; 
    public static void main(String[] args) { 
    Example ex = new Example();
    //1.程序执行.调用change方法,传进去两个有值的参数,一个是good.一个 {'a','b','c'}; 
    ex.change(ex.str,ex.ch); 
    //7.结果输出调用成员变量str值是GOOD,ch的值是gbc
    System.out.print(ex.str+" and "); 
    System.out.print(ex.ch); 

    //2.方法启动,接受参数值(good,{'a','b','c'});
    public void change(String str,char ch[]){ 
    //3.定义一个str的字符变量并赋值为test ok;
    str = "test ok"; 
    //4.修改数组第一个元素的内容.a改为g
    //5.因为数组是引用变量.所以这里改动那么全局改动了;
    ch[0]='g'; 

    }
    这里主要考核你对引用传递的和值的传递的理解!
    你说的结果可能认为是 test ok and gbc
    如果要是这样的结果那么必须改掉
    //1加一个关键字 this 这样就将值"test ok" 传递给成员变量;
    public void change(String str,char ch[]){ 
    this.str = "test ok"; 
    ch[0]='g'; 
    }
      

  5.   

    String类型不也是引用类型吗?怎么不是引用传递啊?
    什么样的是引用传递?什么样的是值传递啊?
      

  6.   

    this.str='test ok'
    就可以了。
      

  7.   

    String 是一个特殊的吧
      

  8.   

    7楼
    String 是一个特殊的吧
    下面是一个图吗?怎么不能显示啊?是什么?
     
      

  9.   

    常量区的直接改变值,堆中对象只改其引用
    public class Example { 
    String str = new String("good"); //首先在堆中创建一个对象(“good”),在栈创建一个32位引用(Example.str)指向堆中的对象(“good”)
    char[] ch = {'a','b','c'}; //常量区:创建a,b,c三个;栈中存引用ch指向这三个
    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指向Example.str;常量直接传值过去
    str = "test ok";//创建了“test ok”,修改了str的引用到“test ok”,并没有修改Example.str的引用,所以当你System.out.print(ex.str+" and ");还是Example.str引用指向的“good”对象
    ch[0]='g'; //由于传的是值,直接改变值;

    }
      

  10.   

    String 是final的,一旦定义不能改变其内容.new 会产生一个新的对象
      

  11.   

    java所有基本类型byte,short,char,int,long,float,double及他们的所有包装类Integer、   Float等,加上String,都是值传递
    其他引用类型都是引用传递
    包装类及String值传递的原理是:
        包装类的值操作实际上都是通过对其对应的基本类型操作而实现
        String也一样,它实际上是对char的值的操作,为值传递
      

  12.   

    这个用图也很难解释清楚。
    关键在于:Java中的所谓的引用,其本身也是一个值。所以,从这点上看,Java中没有引用传递,只有值传递。楼主这个例子和String一点关系都没有。String和数组一样,都是对象,传递进方法的都是引用。
    但注意,这个引用它本身是一个值。方法得到了这个值的一个副本,所以,方法内的引用和方法外的引用是两个独立存在的值。你想通过改变方法内的引用来影响方法外的引用,那是永远办不到的。
    但是,由于方法内的引用和方法外的引用指向的是同一个对象,所以当你改变方法内的引用所指向的对象时,实际上就是改变方法外引用所指向的对象。这就是为什么你可以在方法内改变方法外的那个数组。
      

  13.   

    就是说,在java中,都是值传递,不过是值的内容不一样?
    有的是真正的值本身,而有的是地址值
    那对于String来讲的话,传递的就是真正的值,无所谓引用的概念,所以只是作为参数传递给了方法,和外面的实际的值无关
    而对数组来讲,传递的是地址值,方法内和方法外的引用指向同一个对象,方法内改变了所指向的对象,那实际就是改变了方法外的对象
    就是这么理解吧?
      

  14.   

    对于String来说,传递的也是地址。
      

  15.   

    引用thinking in java 3rd附录A中的一句话:
    java中所有参数传递,执行的都是引用传递。
    看你怎么理解了~~
      

  16.   

    你没理解我说的。传的都是地址,但是对于String,你让参数变量指向了另一个地址(这不影响方法外的那个变量中保存的地址)。但对于数组,你是改变那个地址所指向的对象本身。
      

  17.   

    就是说对数组,方法外和方法内的地址指向的是同一个对象,就是说地址相同
    那对String,方法外和方法内的地址指向的不是同一个对象,就是说地址不同
    但是,那是为什么呢?
      

  18.   

    我倒~~~~str = "test ok"; 
    ch[0]='g';你这两句执行的操作是不一样的,第一句是让str指向另一个地址,第二句你是利用ch指向的地址改变了数组本身。
      

  19.   


    呵呵  Dan彻底无语