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

Saa*_*han 7 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....");
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出将是:

Hellooooo....
Hellooooo....
Hellooooo....
Hellooooo....
10
Run Code Online (Sandbox Code Playgroud)

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

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

pb2*_*b2q 19

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

不,当你e2 = e1你复制对象的引用 -你不使对象的副本-等变量e1,并e2会都指向同一个对象.

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

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


Ton*_*y R 5

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

您需要阅读有关克隆的内容。来自 Java 维基的第一段clone()

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


Raj*_*ani 5

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

e1=e2
Run Code Online (Sandbox Code Playgroud)

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