public class Test {
public static void main(String[] args) {
A a1=new A();  
A a2=new A();  
a1.name ="a1";  
a2=a1;  
a2.name="a2";  
System.out.println("a1.name="+a1.name);  
System.out.println("a2.name="+a2.name);
}
}class A {
public String name;
}运行结果为:
a1.name=a2
a2.name=a2谁能解释一下为什么a1.name=a2

解决方案 »

  1.   


    以上的例子中:创建了2个对象A(或者叫2个引用)
    当 a1.name="a1" 时:在对象a1的属性name赋值为a1
    (也就是说a1这个引用所在的 内存空间的name属性值为a1)
    当 a2=a1 时:此时的a2 的引用不在指向a2的内存空间了
    而是指向了刚才的那个a1的内存空间了。此时其属性也是a1这个对象里德。
    因此 这时候改了name属性的值,实际上是改的a1对象里面的属性的值
    所以输出的结果 都一样a2---- 他们都是指向的同一块内存地址
    不知道说清楚没。。只供参考
      

  2.   

    按程序的执行步骤来分析:public class Test {
    public static void main(String[] args) {
    A a1 = new A(); // 创建对象a1
    A a2 = new A(); // 创建对象a2
    a1.name = "a1"; // 对对象a1的name属性赋值为"a1"
    a2 = a1; // 将a2的引用指向a1 即此时a1、 a2指向同一个对象 
    a2.name = "a2"; // 修改a2所指向对象的属性name为"a2" 由于a1、a2指向同一个对象 所以a1中的name也为"a2"
    System.out.println("a1.name=" + a1.name); // a1.name = "a2"
    System.out.println("a2.name=" + a2.name); // a2.name = "a2"
    }
    }class A {
    public String name;
    }不知这样的解释 楼主能否理解不?
      

  3.   

    一定要认识到Java其实就是在TMD用指针,不要被忽悠! 哈哈哈
    Java的指针其实比C更清晰
      

  4.   

    a2=a1将a1的地址引用赋给了a2,所以a1和a2所代表的应该是同一个对象的引用了
      

  5.   

    不好意思,不会发图片,这有个地址:
    http://hi.baidu.com/emengbingkuai/album/item/16846cdbf0a3f0b177c638ac.html#
    http://hi.baidu.com/emengbingkuai/album/item/16846cdbf0a3f0b177c638ac.html#
    我这不是灌水,是我不会用....