Java 当我运行给定的代码时,我得到一个B A作为输出。我不知道';我不明白为什么它会再次打印
下面提到的Tha代码返回 A. B A. 作为输出,但我不理解为什么A在B之后再次打印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
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预期的答案。我编辑了答案。这可能有助于操作。请检查此链接,谢谢!。我验证并理解了逻辑。