9
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....");
    }
}

The output of this code will be:

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

But if I remove the comments from // e2= e1; when I run the code the system will print 24 instead of 10. I don't understand why is it so?

What I understand is the system will just copy the values of e1 instance into e2 instance. And if the system will do so, the result shall remain the same because both objects are of the same class.

4

4 に答える 4

22

私が理解しているのは、システムが e1 インスタンスの値を e2 インスタンスにコピーするだけだということです。

いいえ、e2 = e1オブジェクト参照をコピーしているので、オブジェクトのコピーを作成していないため、変数e1と変数は両方とも同じオブジェクトe2を指します。

したがって、インクリメントを行うと、それらはすべて同じカウント フィールドをインクリメントします。

e2 = e1インクリメントが 2 つの異なるインスタンスで発生しているのは、割り当てがない場合のみです。

于 2012-08-18T16:51:35.353 に答える
7

これは、Javaの基本原則の1つです。各変数は、あるオブジェクトへの単なるハンドルです。実行中

e1=e2

オブジェクトの値をコピーするのではなく、handles作成された2番目のオブジェクトの両方を指します。インスタンス化した最初のEchoオブジェクトはまったく参照されなくなり、次にgcが実行されたときにガベージコレクションされます。

于 2012-08-18T16:54:02.053 に答える
5

あるオブジェクトを別のオブジェクトに割り当てると、オブジェクト参照(多かれ少なかれポインタ)が割り当てられます。メンバー変数などはコピーされません。

クローン作成について読む必要があります。Java用のwikiの最初の段落からclone()

Javaでは、オブジェクトは参照変数を介して操作され、オブジェクトをコピーするための演算子はありません。代入演算子は、オブジェクトではなく参照を複製します。clone()メソッドは、この不足している機能を提供します。

于 2012-08-18T16:53:34.447 に答える