String name="abc";
name指向"abc"所在的内存地址假如为:00000001。String name="123";"123"所在的地址是否依然是00000001?如果不是的话,那么"abc"在垃圾回收器回收之前,如果做String firstname="abc",这时候"abc"所在的地址是否为00000001。如何通过例子能证明以上的说法呢?

解决方案 »

  1.   

    String name="abc",如果"abc"的地址为:00000001,那么name指向"abc"的地址,也就是00000001。
    如果 name="123",那么name将指向"123",而不是指向"abc",因此name指向地址不是00000001,而"abc"的地址仍然是00000001。
    在"abc"被回收之前,"abc"的地址依然为:00000001。总结:name="123"不是把name的地址付给"123",而是把"123"的地址付给name,即name指向"123"的地址
      

  2.   

    写了一段测试代码:可以说明你提出的问题:
    public class AddLence {
    public static void main(String[] args) {
    String nameAddCopy;
    String name = "abc"; //这个语句声明的是一个指向对象的引用,名为“name”,可以指向类型为String的任何对象,目前指向"Hello
    // world!"这个String类型的对象。
    nameAddCopy = name; //将nameAddCopy的指向指到"123"这个对象,所以nameAddCopy,和name同指一个对象;
    System.out.println(name == nameAddCopy); //测试nameAddCopy,和name是否指同一个对象;结果为true
    name = "123"; //name这个reference的指向变了,这个时候指向"123"这个对象;
    System.out.println(name == nameAddCopy); //比较两个地址时候一样,nameAddCopy是两地址,name
    // 是新地址,结果为false;
    System.gc(); //建议回收,但不是绝对回收
    //String firstname = new String("abc"); //声明了一个新的reference和一个新的对象;这个时候比较是 firstname == nameAddCopy是false;因为new String("abc")申明了一个新对象
    String firstname = "abc"; //声明了一个新的reference,它为:firstname,如果在没有垃圾回收之前,它所指的对象还是原来的"abc",所以这个时候比较还是true!如果垃圾回收了,就是false了; System.out.println(firstname == nameAddCopy); }
    }
      

  3.   

    修改楼上::::::::
    写了一段测试代码:可以说明你提出的问题:
    public class AddLence {
    public static void main(String[] args) {
    String nameAddCopy;
    String name = "abc"; //这个语句声明的是一个指向对象的引用,名为“name”,可以指向类型为String的任何对象,目前指向"abc"这个String类型的对象。
    nameAddCopy = name; //将nameAddCopy的指向指到"abc"这个对象,所以nameAddCopy,和name同指一个对象;
    System.out.println(name == nameAddCopy); //测试nameAddCopy,和name是否指同一个对象;结果为true
    name = "123"; //name这个reference的指向变了,这个时候指向"123"这个对象;
    System.out.println(name == nameAddCopy); //比较两个地址时候一样,nameAddCopy是原地址,name是新地址,结果为false;
    System.gc(); //建议回收,但不是绝对回收
    //String firstname = new String("abc"); //声明了一个新的reference和一个新的对象;这个时候比较是 firstname == nameAddCopy是false;因为new String("abc")申明了一个新对象
    String firstname = "abc"; //声明了一个新的reference,它为:firstname,如果在没有垃圾回收之前,它所指的对象还是原来的"abc",所以这个时候比较还是true!如果垃圾回收了,就是false了; System.out.println(firstname == nameAddCopy); }
    }
    楼上有一些小问题 我做了修改 我觉得就可以解决你的问题了