zoukankan      html  css  js  c++  java
  • 子类继承父类,父类的初始化

    《Thinging in Java》的引用

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

    //: Cartoon.java
    // Constructor calls during inheritance
    class 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 constructor
    Drawing constructor
    Cartoon constructor

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

    //: Chess.java
    // Inheritance, constructors and arguments
    class 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. 编译器会强迫我们在衍生类构建器的主体中首先设置对基础类构建器的调用。
  • 相关阅读:
    【女农场主手记】漂亮地晕和扯淡地安全
    2008最新个人所得税计算公式
    oracle 字符集乱码解决 详细解释了oracle字符集的问题
    单反相机的传奇—佳能单反50年辉煌之路(连载三)
    单反相机的传奇—佳能单反50年辉煌之路(连载七)
    2009年5月重上涠洲岛,大吃海鲜
    单反相机的传奇—佳能单反50年辉煌之路(连载六)
    单反相机的传奇—佳能单反50年辉煌之路(连载八)
    单反相机的传奇—佳能单反50年辉煌之路(连载二)
    单反相机的传奇—佳能单反50年辉煌之路(连载十)
  • 原文地址:https://www.cnblogs.com/aotemanzhifu/p/9192414.html
Copyright © 2011-2022 走看看