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);
System.out.println(); 

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


运行的结果是:good and gbc.但是,以我的想象应该是test ok and gbc才对.因为数组和字符串都是对象,在java当中都是引用类型,按照引用类型传递change方法调用完毕后应该得到的是改变之后的结果,为什么只是把数组的内容该了,而字符串没有被改变呢?

解决方案 »

  1.   

    数组是引用传递.STRING是值传递.str只在CHANGE里面是test ok唉.我说的也乱七八糟的.等待牛人解答吧.不过.我自己还是清楚滴
      

  2.   

    对象参数传的都是对象引用的地址的拷贝.需要注意改变内容和改变地址的区别.数组:ch[0]='g';//改变的是对象的内容,地址没变
    字符串:str="test ok"; //使地址拷贝指向了一个新的地址,但原引用没有改变
      

  3.   

    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(" and "); 
    System.out.print(ex.ch);
    System.out.println(); 

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


    是传递的对象,但是在str="test ok";会创建一个新的对象,不会改变
    ex.str
      

  4.   

    要想改变String参数的内容,恐怕只用这个方法吧
    str.charAt(0)='t';
    str.charAt(1)='e';
    ...
    str.charAt(n)='k';
      

  5.   

    str也是对象为啥就没有改了呢?我又把代码稍作修改,就能够得到所希望的结果.请看:
    public class Example{ 
    StringBuffer str=new StringBuffer("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);
    System.out.println(); 

    public void change(StringBuffer str,char ch[]){ 
    str.append("Hello"); 
    ch[0]='g'; 


    这回得到的结果是:"goodHello and gbc".为什么呢?
      

  6.   

    http://www.javaresearch.org/article/58475.htm
    看看这个
      

  7.   

    malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog  2006-12-01 10:33:17  得分: 0  
     
       要想改变String参数的内容,恐怕只用这个方法吧
    str.charAt(0)='t';
    str.charAt(1)='e';
    ...
    str.charAt(n)='k';
      ============
    不好意思,弄错了!
    str.charAt(n)不是左值,不能赋值的 
      

  8.   

    StringBuffer不同于String, 它是线程安全的可变字符序列,一个类似于 String 的字符串缓冲区,append 方法始终将这些字符添加到缓冲区的末端.StringBuffer str;
    str="test ok"; 
    仍然是改变不了的
      

  9.   

    public void change(StringBuffer str,char ch[]){ 
    str=new StringBuffer("good111111");  
    char[]ch1={'g','o','d'}; 
    ch=ch1;

    测试结果 good and abc方法的传参很妙 你可以使用它得到传递过来的基本数据类型和对象的地址
    对于非基本类型甚至可以直接操作它。比如
    str.append("Hello"); 
    ch[0]='g';但是你一旦重新赋值的话 ,它就变成一个很普通的方法内的局部变量而已。比如
    str=new StringBuffer("good111111");  
    char[]ch1={'g','o','d'}; 
    ch=ch1;接分