黑马程序员技术交流社区

标题: 关于String引用类型问题 [打印本页]

作者: 徐青松    时间: 2014-3-25 21:54
标题: 关于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.str+"````"+Arrays.toString(sc.ch));
               
        }
        public void changed(String stsr,char[] chs)
        {
                stsr="love";
                chs[0]='i';
        }
}
String和char[]都是引用类型,那为什么str没被改变,ch数组打印出来被改变了呢?!(和同学争论了会儿,有点领悟,共勉!)
作者: awkflf11    时间: 2014-3-25 22:42

首先告诉你,,,,

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

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

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



作者: Zero霖    时间: 2014-3-26 00:02
我觉得是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位置上的元素值,输出就会改变。
作者: shi0000    时间: 2014-3-27 23:20
因为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;
    }
}
改为这样就是方法里字符串的名字 了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2