数组传的是 ch的首地址 会改变ch指向内存的值

解决方案 »

  1.   

    java用类名声明的变量实际上是对象的引用,引用做参数实际上会复制引用变量,change方法中的str和ch分别是和main中的str、ch指向同一对象的引用,str="test ok";执行之后str指向了新的对象"test ok",main中的str不变; ch[0]='g';这句话直接操作数组对象,main中的ch也改变,如果改成ch=new char[]{'g'},main中ch就不变了
      

  2.   

    lz学习java没有多久吧,这个问题是很多爱思考的初学者遇到的一个问题,我想lz很明白后面的数组值被换的原理吧,而是不明白String类型的却没有改变值吧:
    1.先说说数组变的原因,因为传的是指向一个堆地址的引用,你在change方法内利用指向这个堆地址的引用向堆发出命令修改了堆中的值,所以另一指向这个堆的引用读取到的值是修改后的。
    2.至于String没有变,楼主听过String类型是不可变的字符串对吧,就是这个不变导致这个"幻想",针对这个问题,String str=new String("good");str引用指向堆中存放new String("good")这个对象的地址,但是String类型跟别的引用类型有一个区别,就是"good"是存放在字符串常量池中的,一旦在字符串常量池中创建了,就会固定在常量池里面,然后调用change(str)方法时,会在方法内创建一个引用,也指向方法外创建的对象在堆中的地址,这个时候在方法内部的代码:str="test ok";的作用是在常量池中初始化一个字符串"test ok",然后将方法内部的这个引用指向常量池中的"test ok",而方法外部的引用还是指向原来对象在堆中的地址,所以是没有改变外部的str的。记住一点:
    引用类型传的是引用没有错,本质上是会在方法内部创建一个新引用,这个引用存放在栈中,这个新的引用和外部传进来的引用在栈中是两个不同的值,但是他们指向堆中同一块地址,当用一个引用调用方法时,另一个引用获取值时能改变的前提是这个堆中的值改变了,如果仅仅是将一个引用指向另一个地址,另外一个引用是不会受影响的,这个String类型就是这个原理。不知道我将清楚没有,希望lz学习进步~
      

  3.   

    change()中间的str覆盖了域中间的str啊,修改为this.str="test ok" 即可,与string是否是可变无关啊。
    膜拜一下楼上的大神OTZ
      

  4.   

    4楼说的很详细,简单的说其实就是String的特殊性,《Java编程思想》关于String那一章的开头说的很清楚了:
    String对象是不可修改的对象,一起看起来会修改String的方法其实都是创建了新的String对象
      

  5.   

    String 默认是final修饰的不可改变变,ch传递的是数组的引用(相当于一个临时的ch指向了原来的ch的地址并改了它的第一个值);
      

  6.   

    9 楼讲的final 与String 是不可变类没有关系,final 只是表示String 类不可被继承。请讲讲 change()中间的str覆盖了域中间的str啊,这个域指的是?   灰常感谢