String的问题 string 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为str传过去的是引用,而ch传过去的是对象,所以结果就可想而知了 方法中的str是局部变量,刚开始是指向的"good"后来指向了"test ok"而原来的成员变量还是指向的"good".方法中的ch是局部变量,指向'a''b''c'而把c[0]改为'g',因为他和成员变量指向同一块内存区域所以成员变量也指向了'g''b''c' 如果你不理解上面的解释,建议你还是先看看java基础的书吧, java有两种传递方式,值传递,和引用传递。ex.change(ex.str,ex.ch); ex.str是一个值传递,本身不会改变。ex.ch它是一个数组,是引用传递,会改变。java中如果传递的是一个对象,或者数组,或者集合,其值都会有改变的情况。 String 对象是不可改变的,只是传递引用 java只有一种传递方式,值传递传过去的都是副本 public void change(String str,char ch[])ex.str传入引用变量的副本,则会有一个新的引用str1(应该是匿名的取个名字好区分)指向原来的String字符串而你将str1指向新的string对象不影响str指向原对象ex.ch也一样,但是区别在于它没让ch1指向新对象,而是依旧指向原对象,这样ch1和ch其实就是一回事了 java传参的时候都是拷贝一份原值传过去首先,String对象str:刚开始change中的str也是指向new String("good")这个对象,但是在change方法中你又重新给它赋值了。String是不可变的,所以其实是新创建了"test ok"对象,然后change中的str指向了"test ok"。但是,这并不影响原来的str。而对于数组ch来说,拷贝的参数和成员变量ch指向的是同一个数组对象,所以改变一个另一个也就改变了 首先,String 和数组都属于 引用传递---并没有上面所说的引用和值传递的区别,值传递指的是八种数据基本类型照成原因分析引用传递 后ex.str 和方法的局部变量str指向的是同一个对象,chang方法执行str=str="test ok"后,会在常量池创建一个新的对象而且此时局部变量指向的地址已经执行"test ok"常量池对象 而ex.str的地址还是原来的"good"地址数组传递后 方法内并没有 改变地址的指向, ch[0]='g':只是改变该地址内的数据,所有值已经改变了同理:如果执行ch=new char[]{'g','b','c'}; 也不会改变ex.ch的数据 String是不可改变的,在调用方法传递参数时String和char[]都是传递的引用,但是String更改值时不改变原来引用所指内存的字符串,而是另外开辟一块内存存放新的字符串,然后将方法中的引用指向这块内存,原来的内存中的字符串不变,而原来的引用也没变,所以全局变量中的字符串没有改变。实在不理解可以参考下StringBuffer和String的区别。 java传递值,局部变量指向新地址,不影响外面变量,指向同一个地址,但是通过地址改变对象内容,那么对象自身当然发生改变. 话说这个还是传值和传地址的区别吧,str在函数中只是一个局部变量而已,但是你的ch,穿的是地址多来,会影响原本的值 public void change(String str,char ch[]){ str="test ok"; ch[0]='g'; }你这个改变的是局部变量str的值,如果你写成 public void change(char ch[]){ str="test ok"; ch[0]='g'; }这样就会改变了 从内部类访问局部变量,局部变量需要被声明为final,为神马? 域用户单点登录 十分急!几个笔试题,帮忙看看!!!! 求助:JFrame class 前面的public private protect 有什么含义,?? 给分了,在线等!!!!!!!! 准确的来说,j2se基础类包括那些包? 学习java遇到的问题 请问java虚拟机和java解释器是一会事吗? 小问题,过来看,可以的话把20拿走:) 如何刷新Panel显示界面 java根据 字段删除重复的数据
方法中的ch是局部变量,指向'a''b''c'而把c[0]改为'g',因为他和成员变量指向同一块内存区域所以成员变量也指向了'g''b''c'
看看java基础的书吧,
ex.change(ex.str,ex.ch);
ex.str是一个值传递,本身不会改变。
ex.ch它是一个数组,是引用传递,会改变。
java中如果传递的是一个对象,或者数组,或者集合,其值都会有改变的情况。
传过去的都是副本
public void change(String str,char ch[])
ex.str传入引用变量的副本,则会有一个新的引用str1(应该是匿名的取个名字好区分)指向原来的String字符串
而你将str1指向新的string对象不影响str指向原对象
ex.ch也一样,但是区别在于它没让ch1指向新对象,而是依旧指向原对象,这样ch1和ch其实就是一回事了
首先,String对象str:刚开始change中的str也是指向new String("good")这个对象,但是在change方法中你又重新给它赋值了。String是不可变的,所以其实是新创建了"test ok"对象,然后change中的str指向了"test ok"。但是,这并不影响原来的str。
而对于数组ch来说,拷贝的参数和成员变量ch指向的是同一个数组对象,所以改变一个另一个也就改变了
引用传递 后ex.str 和方法的局部变量str指向的是同一个对象,chang方法执行str=str="test ok"后,会在常量池创建一个新的对象
而且此时局部变量指向的地址已经执行"test ok"常量池对象 而ex.str的地址还是原来的"good"地址数组传递后 方法内并没有 改变地址的指向, ch[0]='g':只是改变该地址内的数据,所有值已经改变了
同理:如果执行ch=new char[]{'g','b','c'}; 也不会改变ex.ch的数据
{
str="test ok";
ch[0]='g';
}
你这个改变的是局部变量str的值,如果你写成
public void change(char ch[])
{
str="test ok";
ch[0]='g';
}
这样就会改变了