子类继承父类,父类的初始化

来源:互联网 发布:外卖软件下载 编辑:程序博客网 时间:2024/06/05 06:24

《Thinging in Java》的引用

基础类及衍生类,而不再是以前的一个,所以在想象衍生类的结果对象时,可能
会产生一些迷惑。从外部看,似乎新类拥有与基础类相同的接口,而且可包含一些额外的方法和字段。但继承并非仅仅简单地复制基础类的接口了事。创建衍生类的一个对象时,它在其中包含了基础类的一个“子对象”。这个子对象就象我们根据基础类本身创建了它的一个对象。从外部看,基础类的子对象已封装到衍生类的对象里了。当然,基础类子对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器中执行初始化,通过调用基础类构建器,后者有足够的能力和权限来执行对基础类的初始化。在衍生类的构建器中,Java 会自动插入对基础类构建器的调用。下面这个例子向大家展示了对这种三级继承的应用

//: Cartoon.java// Constructor calls during inheritanceclass Art { Art() {     System.out.println("Art constructor");     }}class Drawing extends Art {     Drawing() {         super();//这句代码Java编译器会自动为我们加上,可以省略不写         System.out.println("Drawing constructor");     }}public class Cartoon extends Drawing {     Cartoon() {         super();//这句代码Java编译器会自动为我们加上,可以省略不写         System.out.println("Cartoon constructor");        } public static void main(String[] args) {         Cartoon x = new Cartoon(); }} ///:~

该程序的输出显示了自动调用:

Art constructorDrawing constructorCartoon constructor

含有自变量的构建器
上述例子有自己默认的构建器;也就是说,它们不含任何自变量。编译器可以很容易地调用它们,因为不存
在具体传递什么自变量的问题。如果类没有默认的自变量,或者想调用含有一个自变量的某个基础类构建
器,必须明确地编写对基础类的调用代码。这是用 super 关键字以及适当的自变量列表实现的,如下所示:

//: Chess.java// Inheritance, constructors and argumentsclass Game { Game(int i) { System.out.println("Game constructor"); }}class BoardGame extends Game { BoardGame(int i) {     super(i);     System.out.println("BoardGame constructor");     }}public class Chess extends BoardGame { Chess() {     super(11);     System.out.println("Chess constructor"); } public static void main(String[] args) {         Chess x = new Chess(); }} ///:~

如果不调用 BoardGames()内的基础类构建器,编译器就会报告自己找不到Games()形式的一个构建器。除此以外,在衍生类构建器中,对基础类构建器的调用是必须做的第一件事情(如操作失当,编译器会向我们指出)。

个人总结:

  1. super关键字必须写在构造方法的方法体内的非注释代码的首行
  2. 子类进行初始化,必须调用父类的构造方法,如果父类的所有构造方法都用private修饰了的话,则无法继承,编译报错.
  3. 衍生类构造方法调用父类的构造方法,如果父类是无参构造方法,那么编译器会为衍生类的构造方法首行加上super()。
  4. 编译器会强迫我们在衍生类构建器的主体中首先设置对基础类构建器的调用。
原创粉丝点击