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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐青松 中级黑马   /  2014-3-25 21:54  /  1443 人查看  /  3 人回复  /   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技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览

首先告诉你,,,,

字符串是个常量。一旦初始化就不可以被改变。

字符串是个常量。一旦初始化就不可以被改变。
给你举个例子来说明一下::

                String s = "abc";
                String s1 = "abc";
                System.out.println(s1==s);//true.字符串是可以共享的。在内存中的常量区,一旦有,就赋予他地址。               
            String s="ndvjd";
               s="aaa";
             System.out.println(s); //字符串是ndvjd.不是s,s是引用。


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 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位置上的元素值,输出就会改变。
回复 使用道具 举报
因为String是final修饰的,最终的,而change()方法中的参数是另一个String,即是又创建了一个新的String对象,地址不同,名称也不同
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.changed(sc.str, sc.ch)+"````"+Arrays.toString(sc.ch));
            
    }
    public String changed(String stsr,char[] chs)
    {
            stsr="love";
            chs[0]='i';
            return stsr;
    }
}
改为这样就是方法里字符串的名字 了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马