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.println(ex.ch);
          }
  public void change(String str,char ch[]){
                str="test ok";
                ch[0]='g';
          }
    }
如上代码,运行的结果是 good and gbc 为什么是这样的结果,请高手帮忙,谢谢

解决方案 »

  1.   

    java中,对象和数组是传递的引用,但是String是一个特殊的类,他他任何时候都是传递一份值的拷贝(不是传递引用的拷贝)
    因为数组ch[]传过去的是引用,所以change成功
    String传过去的是"good"的一份拷贝,所以change不会影响到那个str对象
      

  2.   

    补充,如果你传递过去的是String以外的其他类,例如Point,则可以成功changepublic 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.println(ex.ch);
      
      Point pt = new Point(1,2);
      ex.change(pt,ex.ch);
      System.out.println(pt);
      System.out.println(ex.ch);
      }
      public void change(Point pt,char ch[])
      {
      //str="test ok";
      pt.x = 100;
      pt.y = 200;
      ch[0] = 'g';
      }
    }class Point
    {
    public int x;
    public int y;

    public Point(int x, int y)
    {
    this.x = x;
    this.y = y;
    }

    public String toString()
    {
    return x+","+y;
    }
    }
      

  3.   

    那我能不能这样理解呢    String str = new String("good");  是在堆内存中创建了一个对象 char[] ch = {'a','b','c'};         是在栈内存中调用方法的时候,String 传的是引用,不能修改里面的内容,而数组是存放在栈内存中,栈又是共享的,所以能修改
      

  4.   


    数组的引用“ch”确实是保存在栈内存的,但是他的值'a','b','c'是保存在堆内存中的
    调用方法时,数组传过去的引用就是这个引用“ch”,所以能修改
    但是传递String的引用时,其实系统又在堆内存中重新生成了一个String对象,值也是"good",但是此时是另外一个引用,即和之前的str不是同一个引用,所以调用方法时实际上传递的是这个新的引用,被修改的也是这个新的引用指向的对象。
    不好意思,说的好像有些乱,你可以看一下孙鑫的视频
    是关于对象与数组的内存模型以及函数调用是的参数传递的第4课C、第4课D:
    http://tech.163.com/special/00091T71/javashipin.html