0

保存されたシリアル化されたオブジェクトをデータ ファイルからロードするときの変数の参照に問題があります。同じオブジェクトを参照するすべての変数は、変更時に更新されないようです。問題を説明するコードを以下に抜粋しました。

    Tournament test1 = new Tournament();
    Tournament test2 = test1;

    try {
        FileInputStream fis = new FileInputStream("test.out");
        ObjectInputStream in = new ObjectInputStream(fis);

        test1 = (Tournament) in.readObject();

        in.close();

    }
    catch (IOException ex){
        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch (ClassNotFoundException ex){
        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
    }

    System.out.println("test1: " + test1);
    System.out.println("test2: " + test2);

このコードを実行すると、test1 と test2 は同じオブジェクトを参照しなくなります。私の知る限りでは、test2 の宣言で test1 への参照になるため、そうするべきです。test1 が更新されると、test2 は変更を反映し、コードで呼び出されたときに新しいオブジェクトを返す必要があります。ここで重要な何かが欠けているのでしょうか、それとも Java の変数参照がどのように機能するかについて誤解されているのでしょうか?

4

4 に答える 4

3

ここで重要な何かが欠けているのでしょうか、それとも Java の変数参照がどのように機能するかについて誤解されているのでしょうか?

ほとんどの場合、教えられたことを誤解したか、何か間違ったことを教えられました。参照型 (つまり、プリミティブ型ではない) のすべての変数はdirectly、オブジェクトを参照します。

Tournament test1 = new Tournament();

の新しいインスタンスを作成し、それTournamenttest1参照します。

Tournament test2 = test1;

test1からへの参照をコピーしてtest2、両方が同じオブジェクトを参照するようにします。

test1 = (Tournament) in.readObject();

元のオブジェクトを引き続き参照しtest1ながら、ストリームから逆シリアル化された別のオブジェクトを参照しtest2ます。

于 2010-04-15T17:05:06.900 に答える
0

問題は、Java が参照によって受け渡しと代入を行うという概念です。そうではありません。Java は値渡しおよび代入を行います。参照型の場合、渡される値が参照であるということが起こります。

違いは次のとおりです。テストコードがあるとします

Tournament test1 = new Tournament();
Tournament test2 = test1;

test1 = new Tournament();
System.out.println(test1 == test2 ? "Equal" : "Not Equal");

Java が参照によって渡された場合、は単に のエイリアスになるため、出力されEqualます。ただし、Java は値渡しのため、出力されます。test2test1Not Equal

于 2010-04-15T17:13:19.770 に答える
0

シリアライゼーションでオブジェクトをアンマーシャリングし、それを変数に割り当てると、古い参照 (あなたの場合は a new Tournament()) を新しいオブジェクトに置き換えます.test2Tournamenttest1

それはやっているようなものです:

Tournament t1 = new Tournament();
Tournament t2 = t1;

t1 = new Tournament();

しますt1 == t2か?もちろん違います..

于 2010-04-15T17:01:42.270 に答える
0

あなたはtest1どこでも「更新」していません。

この行は、入力ストリームから読み取るタイプののオブジェクトを割り当て、この新しいオブジェクトを次のように割り当てています。Tournamenttest1

test1 = (Tournament) in.readObject();

その間、test2コード ブロックの開始時に割り当てられた元のオブジェクトをまだ指しています。

于 2010-04-15T17:16:02.363 に答える