String生成的是常量,一旦生成,就无法改变了;

解决方案 »

  1.   

    可以尝试用StringBuffer来代替String来试试;
      

  2.   

    你在change方法中只是改变了change方法的str参数的引用,而并没有改变参数的值。而ch[]你改变了这个数组中的第一个对象,这个是改变对象,所以ch[]对象也跟着变化。一定要分清楚什么时候只是修改了对象的引用,而什么时候是修改了对象。一般来说如果改变对象内部的某一部分就属于改变对象。
      

  3.   

    因为String类在源码中定义的是final类型的。如果要修改的话JDK提供了很好用的StringBuffer和StringBuilder。
      

  4.   

    我感觉3楼说的就很对我可以再给你详细解释一下
    传参传的都是复制了原来地址的一份引用当你操作str="Boy";时就相当于str=new String("Boy"); 引用被改变了已经指向了新的地址和原来的String没有关系了;当你操作ch[0]='a';时操作的是对象里的内存值内存被改变了所以ch对象再次操作时值就被改变了
      

  5.   

    楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。
    输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样
      

  6.   

    改成这样:public void change(String str, char ch[]) {
    this.str = "Boy";
    ch[0] = 'a';
    }这样就可以修改!
      

  7.   

    楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。
    输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样
    层主理解错了,java的API文档里详细的说了:字符串是常量;它们的值在创建之后不能更改。这是JVM做的事情,自动给在定义字符串时添加了final来修饰。楼主如果这样写就对了public void change(String str, char ch[]) {
    this.str = "Boy";
    ch[0] = 'a';
    }
      

  8.   

    楼主没定义final的String常量,他定义的是变量。而且String类的final修饰的是类,不能被继承,和String变量是不是常量没关系。
    输出结果是这样的原因是在方法中只将传入参数的值做了修改,在方法执行完出栈之后就跟什么都没发生过一样
    String 定义的字符串本身就是常量;
      

  9.   

    还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下
    定义①→Object(name="张三",age="22")  (引用①指向"123")change(②){
      ②→Object(name="李四",age="55")
    }调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。定义①→Object(name="张三",age="22")change(②){
      ②.age="12"
    }
    这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object
      

  10.   

    还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下
    定义①→Object(name="张三",age="22")  (引用①指向Object(name="张三",age="22") )//上一条这里写错了change(②){
      ②→Object(name="李四",age="55")
    }调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。定义①→Object(name="张三",age="22")change(②){
      ②.age="12"
    }
    这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object
      

  11.   

    值传递和地址传递问题,跟String没有关系,就算这里换成int或其他的数据类型,效果一样。值传递:不管怎么传,原来的实参的值都不会改变。地址传递,原来的实参的值可能被改变。
    数组传递做的的是地址,所以'd'--->'a',String做的值传递,故原值出了方法就还原了。
      

  12.   

    记住java全部是值传递,无引用传递。
    建议看本基础的书。
      

  13.   

    就是,凡是宣扬"Java有引用传递"的都是谬论.
      

  14.   

    Java的传值都是值传递,一种是传递常量值(8种原始数据类型和字符串),一种是传递引用值
      

  15.   

    该楼的解释是对的,Java编程思想里面有提到过这个问题。
      

  16.   

    感觉就像是swap(int ,int)  与swap(int *,int *)的区别
      

  17.   

    还有一点就是什么时候只是修改了对象的引用,什么时候是修改了对象。这点能不能详细说明一下
    定义①→Object(name="张三",age="22")  (引用①指向Object(name="张三",age="22") )//上一条这里写错了change(②){
      ②→Object(name="李四",age="55")
    }调用change方法,其实是让chage的参数②指向Object(name="张三",age="22"),在方法体内引用指向改变为②→Object(name="李四",age="55"),没有改变原来的对象,所以跟原有的①无关。定义①→Object(name="张三",age="22")change(②){
      ②.age="12"
    }
    这时是改变了②所引用的Object对象的age属性也就是改变了Object对象。而①始终指向这个对象,这时打印①,就是打印出来改变的Object
    非常感谢,大神