大家知道当对象a指向对象(a=b)b时,如果b的属性发生改变,则a的属性也改变,但String 类型为什么不是这样,请大家看下面的例子:
public class Student {
private String name; public Student(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}}public class Test {
public static void main(String[] args) {
String s1 = new String();
String s2 = new String();
s1 = s2;
s2 = "aa";
System.out.print(s1);
Student a = new Student("wang");
Student b = new Student("li");
a = b;
System.out.print(s1);
System.out.print(a.getName());
}}
运行Test.java后系统输出 a.getName()为:li
而s1的值却没变为"aa" ?

解决方案 »

  1.   

    Integer i1 = new Integer(1);
            Integer i2 = new Integer(2);
            
            i1 = i2;
            i2 = new Integer(3);
            System.out.println("i1=" + i1);
            System.out.println("i2=" + i2);结果是i1=2
    i2=3
      

  2.   

    我想可能是这样,问题不出在String上,是出在"aa",他代表的是引用,这样s2 = "aa"是改变引用,不改变引用值.
      

  3.   

    majy(冲天剑--技术永无止境 生命永不停息)的程序依然是新建了引用
      

  4.   

    呵呵,="aa"作用跟 = new String("aa");的效果是一样的,= "aa"只是一种方便罢了我只是想引导一下,可过引导的不太好,让人误解了
      

  5.   

    这个问题很简单了,s2和s1一样是引用,不是对象,而new String();创建的才是对象,引用指向的是对象地址。s1=s2是引用传递,将引用s1指向创建s2的对象的地址,然后引用s2指向值为"aa"的对象地址,而s1依然指向s2之前所指向的对象地址。引用指向的是对象地址这句话很重要,引用是放在堆里面的,而对象是放在栈里面的
      

  6.   

    String是不可变类,对String对象的操作所得到的结果产生了新的String对象。
    s1 = s2 使s1,s2指向了同一对象,
    而s2 = "aa";操作使s2指向了新的String对象,而s1没有被改变,故s1不会变成"aa"
      

  7.   

    ref是放在堆里的吗?好象说反了吧:)
      

  8.   

    s1-----> "" <-----s2
    s1-----> "" , s2----->"aa"
    不知道这样表示能否明白?
    s1和s2都是引用,s2改变了所引用的地方,s1保持对s2原有的引用.
      

  9.   

    final类,所代表的字符序列不是它的field成员。
      

  10.   

    String类所包含的数据是不可改变,他同对象包装器,如:Integer,Byte,Long,Double等等一样其包含的数据是不可以改变的,在这方面上你可以简单地把这些类理解为一个数据,一个值而非一个类,只是他们可以当做类来使用