在Java继承中从子类调用的父类构造函数?

时间:2016-05-02 16:54:03

标签: java inheritance

我很清楚,在继承中不会从子类中调用父类构造函数。但在下面的例子中,它被证明是错误的。有人可以解释一下:

import java.io.*;

class Animal {
    int i = 10;

    Animal() {
        System.out.println("Animal constructor called");
    }
}

class Dog extends Animal implements Serializable {
    int j = 20;

    Dog() {
        System.out.println("Dog constructor called");
    }
}

class SerializableWRTInheritance {
    public static void main(String[] args) throws Exception {
        Dog d1 = new Dog();
        d1.i = 888;
        d1.j = 999;
        FileOutputStream fos = new FileOutputStream("abc.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(d1);
        System.out.println("Deserialization started");
        FileInputStream fis = new FileInputStream("abc.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Dog d2 = (Dog) ois.readObject();
        System.out.println(d2.i + "........." + d2.j);
    }
}

输出结果如下:

Animal constructor called
Dog constructor called
Deserialization started
Animal constructor called
10.........999

我不明白为什么在这里打印出Animal构造函数。有人可以回答我上面的问题吗?

1 个答案:

答案 0 :(得分:0)

父类构造函数必须由子类的构造函数调用,但这并不总是需要显式的super()调用。

如果父类有一个默认(无参数)构造函数,那么如果省略对super()的调用,子类构造函数将自动调用它。