构造器是java为我们提供的一个初始化的地方。所以它与我们自己定义的普通方法有着一些特殊之处。当你遇到了复杂的对象的构建过程时,构造器的初始化顺序就变的极为重要了。以下一段代码为大家展示,多层继承与组合所构成的负责类构造器的调用顺序。
package test;
import edu.princeton.cs.algs4.StdOut;
class Meal{
Meal() {
StdOut.println("基类构造器");
}
}
class Bread{
Bread(){
StdOut.println("组合对象Bread构造器");
}
}
class Cheese{
Cheese(){
StdOut.println("组合对象Cheese构造器");
}
}
class Lunch extends Meal{
Lunch(){
StdOut.println("第1层继承子类构造器");
}
}
class PortableLunch extends Lunch{
PortableLunch() {
StdOut.println("第2层继承子类构造器");
}
}
class Sandwich extends PortableLunch{
Sandwich(){
StdOut.println("第3层继承子类构造器");
}
}
public class test_1 extends Sandwich{
private Bread b = new Bread();
private Cheese c = new Cheese();
test_1(){
StdOut.println("第4层继承子类构造器");
}
public static void main(String[] args){
new test_1();
}
}
输出结果如下:
基类构造器
第1层继承子类构造器
第2层继承子类构造器
第3层继承子类构造器
组合对象Bread构造器
组合对象Cheese构造器
第4层继承子类构造器
我的理解
由此可以得出:
(1)编译器最先进入基类调用基类的构造器,然后不断的递归出来到最外层的导出类(子类)
(2)按照声明顺序调用成员的构造器
(3)调用主类的构造器方法
注:
构造器是隐式的static,private是隐式的final