Java 当我运行给定的代码时,我得到一个B A作为输出。我不知道';我不明白为什么它会再次打印

Java 当我运行给定的代码时,我得到一个B A作为输出。我不知道';我不明白为什么它会再次打印,java,serialization,deserialization,objectinputstream,objectoutputstream,Java,Serialization,Deserialization,Objectinputstream,Objectoutputstream,下面提到的Tha代码返回 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 { publi

下面提到的Tha代码返回 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();
    }

}

当您扩展任何类时,它将调用
超类的构造函数,同时创建
子类的对象

举个例子:
对象B
创建后,它将首先调用A1的构造函数。 而
objin.readObject()
只调用A的构造函数

编辑:

反序列化对象时,将运行每个不可序列化超类的无参数构造函数。但是,反序列化的对象是什么?构造函数在反序列化时不运行


这就解释了,B的ctor不会被再次调用,因为它是可序列化的

读取对象类似于运行新对象的构造函数。内存分配给对象并初始化为零(NULL)。没有为不可序列化的类调用参数构造函数

ab
在调用
newb()
时打印,它首先调用A的ctor,然后调用B。
然后
objin.readObject()
只调用A的构造函数,并打印第二个
A
在反序列化过程中调用
A
的构造函数,因为
A
没有实现
可序列化的
。这个答案很好地解释了这一点:


构造函数从基类调用到派生类

因此,对于
bb=newb()构造函数将按A->B的顺序调用,因此打印
AB


现在来看
objin.readObject()

只有A的构造函数将被调用,而不是B的构造函数。这是因为

  • 对于可序列化对象,将运行第一个不可序列化超类型(即
    A1
    )的无参数构造函数。由于
    A1
    未实现可序列化,因此将调用它的构造函数

  • 在反序列化过程中,构造函数不会对可序列化的类(即
    B
    )执行。因此,不会第二次调用B的构造函数

因此输出,
aba

这在Say的Java文档中提到

读取对象类似于运行新对象的构造函数 对象为对象分配内存并将其初始化为零 (空)没有为不可序列化的对象调用参数构造函数 类,然后恢复可序列化类的字段 从最接近的可序列化类开始的流 对象,并以对象最具体的类结束

因此,在创建B类实例时

B b = new B();  // prints A B
它打印A、B和

在反序列化时

objin.readObject();  // prints A as per docs
它打印一个字符串,因为类A是不可序列化的,文档中说没有为不可序列化的类调用arg构造函数


因此,您得到的输出为
aba

不回答问题question@upog是的,这不是OP预期的答案。我编辑了答案。这可能有助于操作。请检查此链接,谢谢!。我验证并理解了逻辑。