4

以下のコードは A B A を出力として返しますが、なぜ A が B の後に再度出力されたのか、そのロジックを理解できませんでした。

class A1 {
    public A1() {
        System.out.println("A");
    }
}

class B extends A1 implements Serializable {
    public B() {
        System.out.println("B");
    }

}

public class Test {

    public static void main(String... args) throws Exception {
        B b = new B();      // Object of class B
        ObjectOutputStream objout=new ObjectOutputStream(new FileOutputStream("t.txt"));
        objout.writeObject(b);

        ObjectInputStream objin=new ObjectInputStream(new FileInputStream("t.txt"));
        objin.readObject();
    }

}
4

5 に答える 5

4

B の ctor はシリアライズ可能であるため、再度呼び出されることはありません。

オブジェクトの読み取りは、新しいオブジェクトのコンストラクターの実行に似ています。オブジェクトにメモリが割り当てられ、ゼロ (NULL) に初期化されます。シリアル化できないクラスに対しては、引数なしのコンストラクターが呼び出されます。

A Bを呼び出すとnew B()、最初に A の ctor が呼び出され、次に Bが呼び出されます。次にobjin.readObject()、A の ctor のみが呼び出され、2 番目が出力されAます。

于 2013-09-28T12:18:41.400 に答える
1

のコンストラクタは、 を実装していないAため、逆シリアル化中に呼び出されます。この答えはそれをよく説明しています:ASerializable

Java:デシリアライゼーションでコンストラクターが呼び出されないのはなぜですか? & 最善の回避策は何ですか?

于 2013-09-28T12:20:20.597 に答える
0

コンストラクターは、基本クラスから派生クラスに呼び出されます。

したがって、B b = new B();コンストラクターは A->B の順序で呼び出されるため、印刷A B


今のところobjin.readObject();

Bのコンストラクターではなく、Aのコンストラクターのみが呼び出されます。これは、

  • シリアライズ可能なオブジェクトの場合、最初のシリアライズ不可能なスーパータイプ (つまり)の引数なしのコンストラクタA1が実行されます。は Serializable を実装していないため、そのコンストラクターが呼び出されますA1

  • デシリアライゼーション中、クラス (つまり) のコンストラクターは実行されません。したがって、B のコンストラクターは 2 回目に呼び出されません。serializableB

したがって、出力、A B A

これはドキュメントに記載されています

于 2013-09-28T12:23:21.810 に答える
0

ObjectInputStreamの Java ドキュメントには、

オブジェクトの読み取りは、新しいオブジェクトのコンストラクターの実行に似ています。オブジェクトにメモリが割り当てられ、ゼロ (NULL) に初期化されます。シリアライズ不可能なクラスに対して引数なしのコンストラクターが呼び出された後、シリアライズ可能クラスのフィールドが ストリームから復元され、java.lang.object に最も近いシリアライズ可能クラスから始まり、オブジェクトの最も具体的なクラスで終了します。

したがって、クラス B インスタンスの作成中に、

B b = new B();  // prints A B

A、Bを出力し、

デシリアライズ中、

objin.readObject();  // prints A as per docs

クラス A はシリアル化できないため、 A を出力し、 docs には、シリアル化できないクラスに対して引数なしのコンストラクターが呼び出されると書かれています。

したがって、一緒に次のような出力が得られますA B A

于 2013-09-28T13:24:24.810 に答える