将对象分配给另一个对象时会发生什么

public class DrumKitTestDrive { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Echo e1 = new Echo(); Echo e2 = new Echo(); // **e2 = e1;** int x=0; while( x 0){ e2.count = e2.count + e1.count; } x = x + 1; } System.out.print(e2.count); } } class Echo { int count = 0; void hello(){ System.out.println("Hellooooo...."); } } 

此代码的输出将是:

 Hellooooo.... Hellooooo.... Hellooooo.... Hellooooo.... 10 

但是,如果我删除// e2= e1;的评论// e2= e1; 当我运行代码时,系统将打印24而不是10 。 我不明白为什么会这样?

据我所知,系统只是将e1实例的值复制到e2实例中。 如果系统会这样做,结果将保持不变,因为两个对象属于同一类。

据我所知,系统只是将e1实例的值复制到e2实例中。

不,当你执行e2 = e1你正在复制对象引用 – 你没有复制对象 – 因此变量e1e2都将指向同一个对象

因此,当您进行增量时,它们都会递增相同的计数字段。

仅在没有赋值e2 = e1 ,增量发生在两个不同的实例上。

这是Java的基本原则之一。 每个变量只是某个对象的句柄。 执行

 e1=e2 

不复制对象的值,它将两个handles指向创建的第二个对象。 您实例化的第一个Echo对象现在根本没有被引用,并且在下次gc运行时将被垃圾收集。

将一个对象分配给另一个对象只是指定对象引用(指针或多或少)。 它不会复制成员变量等。

你需要阅读有关克隆的内容 。 从wiki的第一段开始,用于Java clone()

在Java中,对象通过引用变量进行操作,并且没有用于复制对象的运算符 – 赋值运算符复制引用,而不是对象。 clone()方法提供了这个缺少的function。