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

时间:2012-08-18 16:48:59

标签: java object

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 < 4 ){
        e1.hello();
        e1.count = e1.count + 1;
        if(x==3){
            e2.count = e2.count + 1;
        }
        if(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;删除评论,系统将打印 24 而不是 10 。我不明白为什么会这样?

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

4 个答案:

答案 0 :(得分:18)

  

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

不,当你e2 = e1复制对象引用时 - 你没有复制对象 - 所以变量e1和{{ 1}}都会指向同一个对象

所以当你做增量时,它们都会递增相同的计数字段。

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

答案 1 :(得分:5)

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

e1=e2

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

答案 2 :(得分:4)

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

您需要了解cloning。从维基的第一段开始,用于Java clone()

  

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

答案 3 :(得分:0)

尝试为方法Echo创建构造函数,并使用另一个对象作为参数。 并将参数对象的值分配给该对象。 即 '''

Echo(Echo echo){
this.var = echo.var;
}

'''