请教一个值传递的问题,请千万要教教我代码在 数组传的是 ch的首地址 会改变ch指向内存的值 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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就不变了 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学习进步~ change()中间的str覆盖了域中间的str啊,修改为this.str="test ok" 即可,与string是否是可变无关啊。膜拜一下楼上的大神OTZ 4楼说的很详细,简单的说其实就是String的特殊性,《Java编程思想》关于String那一章的开头说的很清楚了:String对象是不可修改的对象,一起看起来会修改String的方法其实都是创建了新的String对象 String 默认是final修饰的不可改变变,ch传递的是数组的引用(相当于一个临时的ch指向了原来的ch的地址并改了它的第一个值); 9 楼讲的final 与String 是不可变类没有关系,final 只是表示String 类不可被继承。请讲讲 change()中间的str覆盖了域中间的str啊,这个域指的是? 灰常感谢 求问一个关于界面的bug 关于Java输出的问题 MyEclipse 7.0汉化问题 oracle 对一个 J2EE 软件项目的代码进行打印,有什么工具可以推荐? 求移动CMPP2 MSGID生成和解码的算法 怎样在程序运行时动态增减显示行数。高分相送!!!! 学了一段时间Java,感觉无法再提高一个层次了,请高手指点。 大神赶紧来 【高分】applet中的一个按钮,点击后reload该Applet. 一个类的属性是引用类型,那创建对象时候堆里保存的是地址还是值呢? 关于BigDecimal除法结果保留小数位数的问题
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学习进步~
膜拜一下楼上的大神OTZ
String对象是不可修改的对象,一起看起来会修改String的方法其实都是创建了新的String对象