String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Test ex=new Test();
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';
}
}为什么str没变?

解决方案 »

  1.   

    String 是final类型的,每次都是生成一个新的对象;
    而且你再change方法中只改变了引用,是不能改变实参的值的;
    建议楼主用StringBuffer来代替楼主的String类型;这样楼主能比较清晰的明白java中的参数是值传递的
      

  2.   

    你改的是过程里面的局部变量.而没有对ex.str发生改变!
      

  3.   

    StringBuffer或StringBuilder来实现 JAVA不是C 分传值和传地址的
      

  4.   

    str对象的引用被复制一份传递给了change函数,所以,你在change函数里面对str重新赋值后不会影响到change函数以外的区域;之所以ch[]变了,是因为“ch[0]='g'”这条语句并没有重新对数值对象重新赋值,只是改变了这个数组对象的一个元素。
      

  5.   

    如果你将
    ch[0]='g'
    改为
    ch = new char[]{'I','B','M'};
    外面的ch同样不会改变
      

  6.   

    引用 Core Java2的一句话:
    如果定义为final 构建对象时必须初始化它,并且在后面的操作中,不能够对它进行更改!
    而String是定义为final的.
    所以str就不能更改了.
      

  7.   

    String每改变一次值.也就是说又在字符串常量池里生成了一个新的字符串!
    String str="abc";
    str.concat("edf");
    str的值还是abc!
      

  8.   

    注意是引用传递,你将str的引用传给了方法change(String),而在方法里修改的只是str的副本,而且String是不可改变类,你是没有办法改变生成的对象的,只能改变引用.
      

  9.   

    一句话,在java中,参数传递是值传递,引用类型(值传递)也就是穿了地址,所以楼主不知听明白了没?
      

  10.   


    我觉得这跟String 是final无关,关键是参数传递的问题