Java面向对象软件开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.5 派生类的初始化

如果有一个名为B的子类和一个名为A的父类,构造B对象时,A的构造方法是否要执行?如果要执行,A的构造方法在B之前还是之后执行?答案是在一个类层次中,如果构造子类对象,必先调用父类构造方法;构造方法按派生顺序,即从父类到子类的顺序被调用。

例2-8】 下面的程序展示了何时执行构造方法:

            //父类A
            class A {
                public A() {
                    System.out.println("执行父类A的构造方法");
                }
            }
            // 子类B,继承于父类A
            class B extends A {
                public B() {
                    System.out.println("执行子类B的构造方法");
                }
            }
            public class Test {
                public static void main(String[] args) {
                    B a = new B();
                }
            }

该程序的运行结果如下:

            执行父类A的构造方法
            执行子类B的构造方法

可以看出,构建子类对象的时候将先调用父类的构造方法。

在创建派生类的对象时,使用派生类的构造方法对其初始化,不但要对自身的成员变量赋初值,还要对父类的成员变量赋初值。因为成员变量赋初值通常在构造方法中完成,因此在Java语言中,允许派生类继承父类的构造方法。构造方法的继承遵循如下的原则:

(1)若父类是无参数的构造方法,则子类无条件地继承该构造方法。

(2)若子类无自己的构造方法,则它将继承父类的无参构造方法作为自己的构造方法。

(3)若子类有自己的构造方法,则在创建子类对象时,它将先执行继承自父类的无参构造方法,然后再执行自己的构造方法。如【例2-8】所示。

(4)若父类是有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。