我很清楚,在继承中不会从子类中调用父类构造函数。但在下面的例子中,它被证明是错误的。有人可以解释一下:
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构造函数。有人可以回答我上面的问题吗?
答案 0 :(得分:0)
父类构造函数必须由子类的构造函数调用,但这并不总是需要显式的super()
调用。
如果父类有一个默认(无参数)构造函数,那么如果省略对super()
的调用,子类构造函数将自动调用它。