public class Parent {
public Parent() {
System.out.println("Parent");
}
}
public class Child extends Parent implements Serializable {
public Child() {
System.out.println("Child");
}
}
public class Demote {
public static void main(String[] args) {
Child c=new Child();
try {
FileOutputStream fos=new FileOutputStream
("D:\\DemoFile\\Testword5.txt");
ObjectOutputStream oot=new ObjectOutputStream(fos);
oot.writeObject(c);
FileInputStream fin=new FileInputStream
("D:\\DemoFile\\Testword5.txt");
ObjectInputStream oin=new ObjectInputStream(fin);
oin.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
此代码的输出为 - Parent Child Parent。
调用第一组Parent Child,因为调用了零参数构造函数。 oin.readObject()返回一个子对象。那么为什么只调用父类的构造函数,为什么不调用子类
答案 0 :(得分:2)
调用Parent构造函数是因为它没有实现Serializable。然而,Child实现了Serializable,因为它没有被调用。
答案 1 :(得分:1)
引自The Java Docs for Serializable:
为了允许序列化非可序列化类的子类型,子类型可能负责保存和恢复超类型的public,protected和(如果可访问)包字段的状态。只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这种情况,则声明类Serializable是错误的。将在运行时检测到错误。
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。必须可以对可序列化的子类访问no-arg构造函数。可序列化子类的字段将从流中恢复。
Serializable类本身不需要no-args构造函数,如果它存在,它将不会用于初始化它们。