来自《On Java》基础卷176页的例子,进行了精简。
class Shape {
Shape() {
System.out.println("Shape");
}
}
class Line extends Shape {
Line() {
super();
System.out.println("Line");
}
}
public class CADSystem extends Shape {
private Line li = new Line();
public CADSystem() {
super();
System.out.println("CADSystem");
}
public static void main(String[] args) {
CADSystem x = new CADSystem();
}
}
执行结果如下
Shape
Shape
Line
CADSystem
按照本书之前的说法
变量定义会在任何方法(包括构造器)调用之前被初始化
所以我认为是先执行new Line(),输出 Shape、Line
然后执行CADSystem的构造器,输出 Shape、CADSystem
为什么会先输出两个Shape ?
基类初始化是在变量之前的。
即便是在构造函数里显式调用的 super() ,成员的变量初始化也会被插入 super() 跟剩余的构造函数体之间。
https://docs.oracle.com/javas...