父类构造函数

时间:2015-08-17 10:12:45

标签: java

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()返回一个子对象。那么为什么只调用父类的构造函数,为什么不调用子类

2 个答案:

答案 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构造函数,如果它存在,它将不会用于初始化它们。