class  Aaa
{
public static void main(String[] args) 
{
char ch[]={'H','e','l','l','o'};
String str=new String("World");
change(ch,str);
System.out.println(str+" and "+new String(ch,0,4));
} public static void change(char ch[],String str){
str="Changed";
ch[0]='S';
}
}
// 为什么返回的是World and Sell,我觉得应该是Changed and Sell,(不过结果的确是他对的.但为什么,String 不是传引用的吗?)

解决方案 »

  1.   

    String 是不允许修改的,所以任何修改都会重新生成一个String
    方法change里面的str一开始和main里面指向了同一个地方
    在你改了之后,change里面的改了,可是main里面的不会改,还指向以前的那个。
      

  2.   

    恩,似乎懂一点了,但是再请问一下,那我要达到 返回结果是 Changed   and   Sell上面那个程序该怎么修改呢?
      

  3.   

    如果想得到你想要的输出,把str和ch声明为成员变量,在方法内直接更改,不用再传参数。
      

  4.   

    class     Aaa 

    public   static   void   main(String[]   args)   

    char   ch[]={'H','e','l','l','o'}; 
    StringBuffer   str=new   StringBuffer("World"); 
    change(ch,str); 
    System.out.println(str+"   and   "+new   String(ch,0,4)); 
    } public   static   void   change(char   ch[],StringBuffer   str){ 
    str.delete(0,str.length());
    str.append("Changed"); 
    ch[0]='S'; 

    }
      

  5.   

    class Aaa {
      public static void main(String[] args) {
        char ch[] = { 'H', 'e', 'l', 'l', 'o' };
        String str = new String("World");  // 返回值
        str = change(ch, str);
        System.out.println(str + "   and   " + new String(ch, 0, 4));
      }  public static String change(char ch[], String str) {
        str = "Changed";
        ch[0] = 'S';
        return str; // 返回修改后的
      }
    }
      

  6.   

    To七楼:
    你可能不明白楼主的意思,楼主想通过方法改变字符串引用本身.就是以前指向World,现在这个对象不指向World了(World从内存中消失了),而去指向Changed了.你的这个方法是重新给str赋值(就是重新创建了一个字符串对象),以前的那个World还是在内存中.因为string创建的对象是不可以改变的.如果多调用这个方法会创建很多新对象,结果对性能会有影响.退一步说,如果要创建新对象,那也不要方法返回了,在打印前直接就给他赋值就可以了,str = "Changed";这是我的一点看法.如果有不同看法可以讨论.
      

  7.   

    在main方法中的str引用变量(为了描述方便这里叫str1),里面存放了一个字符串对象"World"的引用。在change方法中另外开辟了一个引用变量也叫str(为了描述方便这里叫str2),这两个引用变量不是同一个变量,当main方法调用change方法的时候,把main方法的str1引用变量里面存放的值传递给了change方法str2引用变量。这是参数传递的基本过程。
    在change方法里面执行了str2="Changed"的时候,新建了一个"changed"字符串对象,此时把这个字符串对象的引用防止到str2中,如果用在changed方法中增加System.out.println(str)语句,那么会把changed字符输出。整个过程中并没有修改main方法中str1引用变量地址值。所以在main方法中输出str的时候,仍然输出World了。
      

  8.   

    其实很简单:Java语言中方法的调用只有传值,没有什么传引用,什么ref,in,out。但要知道的是,比如:String str = new String("World"); str不是一个对象,也不是某个类的实例,它是一个引用,一个句柄。所以当你调用方法的时候,不管传递的参数是基本类型变量,还是引用类型变量,都是不会改变的。能改变的只是引用所指向的堆上的对象。这点很重要!不过这里String类是比较特殊罢了。
      

  9.   

    char   ch[]是操作地址的,而str只是一个拷贝
      

  10.   

    12楼的有点对头了。不过还少说了一点。
    如下列代码
    void g(){
       String a = "abc";
       f(a);
    .......
    }
    void f(String s){
      s="bcd";
    }在调用f函数的时候,对g函数中的a做了一个copy(不是对a所指向的对象做一个copy),然后把这个copy传递给了f函数。
    在f函数中对s的任意操作都与原来的a无关。只不过,f函数刚开始执行的时候,s和原来的a指向同一个对象而已。
      

  11.   

    12楼的有点对头了。不过还少说了一点。
    如下列代码
    void g(){
       String a = "abc";
       f(a);
    .......
    }
    void f(String s){
      s="bcd";
    }在调用f函数的时候,对g函数中的a做了一个copy(不是对a所指向的对象做一个copy),然后把这个copy传递给了f函数。
    在f函数中对s的任意操作都与原来的a无关。只不过,f函数刚开始执行的时候,s和原来的a指向同一个对象而已。
      

  12.   

    你去看看string和stringbuffer的区别就知道了。
    你上面的string如果改成stringbuffer就和你预期的结果一样了。