A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐青松 中级黑马   /  2014-3-25 21:55  /  1339 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class StrChTest {
        String str="good";
        char[] ch=new char[]{'n','i','g','h','t'};
        public static void main(String[] args) {
                StrChTest sc=new StrChTest();
                sc.changed(sc.str, sc.ch);
                System.out.print(sc.str+"````"+Arrays.toString(sc.ch));
               
        }
        public void changed(String stsr,char[] chs)
        {
                stsr="love";
                chs[0]='i';
        }
}
String和char[]都是引用类型,那为什么str没被改变,ch数组打印出来被改变了呢?!(和同学争论了会儿,有点领悟,共勉!)

评分

参与人数 1技术分 +2 收起 理由
itpower + 2

查看全部评分

6 个回复

倒序浏览
因为string类型的值是个常量,是分配在heap区,他的值是不可以改变的,你在里面修改了strs的值,是重新开辟了一个内存空间用来存储"love",又将love的引用赋给了stsr,所以str的值是没有改变的..

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
我觉得是changed方法中参数String stsr接收了sc.str在内存中的地址,也就是说stsr指向了字符串对象"good",而当参数stsr="love"时,stsr指向的是另一个字符串对象,这里只是改变了stsr的指向而没有改变sc.str变量的指向,sc.str变量仍然指向"good",所以输出当然是不变的。而参数char[] chs指向了sc.ch的字符数组,chs[0]='i'相当于sc.ch[0]='i'就会修改sc.ch数组中0位置上的元素值,输出就会改变。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 my_android_drea 于 2014-3-26 00:48 编辑

当  String str="good";  时
str---------->good

当   sc.changed(sc.str, sc.ch);
      public void changed(String stsr,char[] chs) { }    时
str------------>good
stsr---------->good
(此时有两个变量存放good的地址)

当   stsr="love";  时
str------------>good
stsr----------->love

(此时stsr存放的不再是good的地址,而是重新赋的love的地址)





评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
我画了一个图来说明问题:
1,刚进入sc.changed(sc.str, sc.ch)时,stsr 和 str 的值内容都是good的地址,ch 和 chs 都是指向'n'。
2, stsr="love"; 这句之后str还是指向good,stsr指向love(又产生了新对象),所以stsr没有改变。过程如图数字标识。当执行到chs[0]='i';时,将n改变为i,是将老对象的值改变了,所以在chs消亡后,ch指向的对象也变了。

123.jpg (137.16 KB, 下载次数: 13)

123.jpg

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
string是一个类类型数据,而char【】是一个基本类型数据,String str = “abc”;str就是指向了abc的对象
而string一旦附初始值就不能在改变,String stsr ==== String stsr = new String()  stsr是一个想的对象引用,指向了“abc”stsr = “love”stsr指向了love,但是str一直都是在指向的“abc”

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
借鉴一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马