关于声明的问题!!大家一定要帮我!帮我的给5QB,我QQ87 
在看我的问题之前先看看实例 实例: class A 

private String i; 
public void setI(String x) 

i=x; 

public String getI(){ 
return i; 

} public class java { 
public static void main(String[] args) { 
A s1=new A(); 
A s2=new A(); 
s1.setI("a"); 
s2.setI("b"); 
System.out.println("a的i="+s1.getI()); 
System.out.println("b的i="+s2.getI()); 
s1=s2; //s1指向s2的地址 
s1.setI("c"); //s1的值改为c,即s1指向的s2的值变为c 
System.out.println("a的i="+s1.getI()); 
System.out.println("b的i="+s2.getI()); } } 即输出的是 abcc 大家在看看下面这个问题: 
问题: public class java 

public static void main(String args[]) 
{ String s1=new String("a");//创建指向a的引用s1 
String s2=new String("b");//创建指向b的引用s2 System.out.println("s1="+s1); 
System.out.println("s2="+s2); 
s1=s2;//s1指向s2的地址 
s1="c";//s1的值改为c,即s1指向的s2值变为c 
System.out.println("s1="+s1); 
System.out.println("s2="+s2);//为什么s2还是b,而不是c? } } 大家看看这个题,我注释的部分哪里不对?? 我认为输出的是 abcc啊 
可是 输出的是 abcb 谁能解释一下 

解决方案 »

  1.   

    s1="c";//s1的值改为c,即s1指向的s2值变为c 这里错了,s1 = "c"表示把s1把向字符串“c”,相当于s1 = new String("c");并不是把s1指向的s2值变为c
      

  2.   

    s1="c"; 等价于 s1=new String("c");
    此时s1指向的是一个新创建的对像,s2指向的仍然是"b"
      

  3.   

    String对象有其特殊性,String对象建立后,其内存空间的内容不可以被修改,只能重新分配内存空间,建立新的对象。也就是说:
    String a="xxx";//声明了引用a,指向一个字符串对象,其内容为xxx;等同于String a=new String("xxx");
    a="yyy";//引用a重新指向了一个字符串对象yyy,等同于a=new String("yyy");而不是将对象xxx的内容修改为yyy,原来的xxx不可以被修改
      

  4.   

    s1是string型的,每次赋值都等于重新指向新的内存地址
    所以推荐用bufferstring
      

  5.   

    s1="c";//s1的值改为c,即s1指向的s2值变为c s1指向的值为“c”,s2不变;
      

  6.   

    s1=s2;//s1指向s2的地址   
    s1="c";//s1的值改为c,即s1指向的s2值变为c ————————————————————————
    s1=s2;//s1指向s2的地址 
    s1="c";//建立新对象"c",并把句柄赋给s1。 s1不指向s2了
    ps:String会不停的创建对象,不停的改变句柄^^
      

  7.   

    请看jdk的源码String.java中的注释:
    * Strings are constant; their values cannot be changed after they
     * are created. String buffers support mutable strings.
     * Because String objects are immutable they can be shared. For example:
    //请看jdk的源码String.java中的注释:String是常量,所以String被创建之后它的值不能被修
    //改,StringBuffer支持动态修改.String不可变,所以如下所示:
     *     String str = "abc";
     * is equivalent to:
     *     char data[] = {'a', 'b', 'c'};
     *     String str = new String(data);
    所以:
    s1="c";//等价于char data[]={'c'} ;String s1 = new String(data);
      

  8.   

    其实打个比方,把对象s1,s2看作电视的话,当对象s1=s2时是建立了一种联系,也就是s1的遥控器可以控制s2,控制的方法就是调用s1的方法可以修改s2的属性,你的第一个例子中s1.setI("c")就是调用了方法。而第二个例子只是修改了遥控器的状态,并没有调用s1的方法去修改s2的属性,所以s2当然不变了。