<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0


    ??? 缺省構造函數的問題:base類是父類,derived類是子類,首先要說明的是由于先有父類后有子類,所以生成子類之前要首先有父類。class是由class的構造函數constructor產生的,每一個class都有構造函數,如果你在編寫自己的class時沒有編寫任何構造函數,那么編譯器為你自動產生一個缺省default構造函數。這個default構造函數實質是空的,其中不包含任何代碼。但是一牽扯到繼承,它的問題就出現了。

    ??? 如果父類base class只有缺省構造函數,也就是編譯器自動為你產生的。而子類中也只有缺省構造函數,那么不會產生任何問題,因為當你試圖產生一個子類的實例時,首先要執行子類的構造函數,但是由于子類繼承父類,所以子類的缺省構造函數自動調用父類的缺省構造函數。先產生父類的實例,然后再產生子類的實例。如下:

    class base{
    }
    class derived extends base{
    public static void main(String[] args){
    ??? derived d=new derived();
    }
    }

    下面我自己顯式地加上了缺省構造函數:
    class base{
    base(){
    ??? System.out.println("base constructor");
    }
    }
    class derived extends base{
    derived(){
    ??? System.out.println("derived constructor");
    }
    public static void main(String[] args){
    ??? derived d=new derived();
    }
    }

    執行結果如下:說明了先產生base class然后是derived class。
    base constructor
    derived constructor

    我要說明的問題出在如果base class有多個constructor而derived class也有多個constructor,這時子類中的構造函數缺省調用那個父類的構造函數呢?答案是調用父類的缺省構造函數。但是不是編譯器自動為你生成的那個缺省構造函數而是你自己顯式地寫出來的缺省構造函數。

    class base{
    base(){
    ??? System.out.println("base constructor");
    }
    base(int i){
    ??? System.out.println("base constructor int i");
    }
    }
    class derived extends base{
    derived(){
    ??? System.out.println("derived constructor");
    }
    derived(int i){
    ??? System.out.println("derived constructor int i");
    }
    public static void main(String[] args){
    ??? derived d=new derived();
    ??? derived t=new derived(9);
    }
    }

    D:\java\thinking\think6>java derived
    base constructor
    derived constructor
    base constructor
    derived constructor int i

    如果將base 類的構造函數注釋掉,則出錯。

    class base{
    // base(){
    //??? System.out.println("base constructor");
    // }
    base(int i){
    ??? System.out.println("base constructor int i");
    }
    }
    class derived extends base{
    derived(){
    ??? System.out.println("derived constructor");
    }
    derived(int i){
    ??? System.out.println("derived constructor int i");
    }
    public static void main(String[] args){
    ??? derived d=new derived();
    ??? derived t=new derived(9);
    }
    }


    D:\java\thinking\think6>javac derived.java
    derived.java:10: cannot resolve symbol
    symbol : constructor base ()
    location: class base
    derived(){
    ?????????? ^
    derived.java:13: cannot resolve symbol
    symbol : constructor base ()
    location: class base
    derived(int i){
    2 errors

    說明子類中的構造函數找不到顯式寫出的父類中的缺省構造函數,所以出錯。

    那么如果你不想子類的構造函數調用你顯式寫出的父類中的缺省構造函數怎么辦呢?如下例:

    class base{
    // base(){
    //??? System.out.println("base constructor");
    // }
    base(int i){
    ??? System.out.println("base constructor int i");
    }
    }
    class derived extends base{
    derived(){
    ??? super(8);
    ??? System.out.println("derived constructor");
    }
    derived(int i){
    ??? super(i);
    ??? System.out.println("derived constructor int i");
    }
    public static void main(String[] args){
    ??? derived d=new derived();
    ??? derived t=new derived(9);
    }
    }


    D:\java\thinking\think6>java derived
    base constructor int i
    derived constructor
    base constructor int i
    derived constructor int i

    super(i)表示父類的構造函數base(i)請大家注意:一個是super(i)一個是super(8)。大家想想是為什么??

    結論:
    子類如果有多個構造函數的時候,父類要么沒有構造函數,讓編譯器自動產生,那么在執行子類構造函數之前先執行編譯器自動產生的父類的缺省構造函數;要么至少要有一個顯式的缺省構造函數可以讓子類的構造函數調用。

    posted on 2009-08-09 13:18 jadmin 閱讀(112) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲天堂一区在线| 国产av无码专区亚洲av桃花庵| 亚洲日韩图片专区第1页| a级黄色毛片免费播放视频| 国产成人精品日本亚洲专区61| 污视频网站在线免费看| 男人的天堂亚洲一区二区三区| 亚洲av日韩av无码av| 最新免费jlzzjlzz在线播放| 亚洲啪AV永久无码精品放毛片| 蜜臀91精品国产免费观看 | 午夜精品在线免费观看| 亚洲娇小性色xxxx| 女人被免费视频网站| 最好2018中文免费视频| 伊人亚洲综合青草青草久热| 国产在线精品免费aaa片| 亚洲伦理一区二区| 成年人免费视频观看| 免费人成再在线观看网站| 亚洲人成人一区二区三区| 69式互添免费视频| 国产精品亚洲а∨无码播放不卡 | 亚洲av片不卡无码久久| 国产精品美女自在线观看免费| 特级毛片全部免费播放| 亚洲av福利无码无一区二区| 日韩在线免费视频| 曰批免费视频播放免费| 亚洲AV成人精品网站在线播放| 可以免费看的卡一卡二| 视频一区在线免费观看| 亚洲天堂一区二区| 国产极品美女高潮抽搐免费网站| 国产成人无码精品久久久久免费| 亚洲蜜芽在线精品一区| 国产一级高清视频免费看| 免费看男人j放进女人j免费看| 一本天堂ⅴ无码亚洲道久久| 中文字幕人成人乱码亚洲电影| 一级女人18毛片免费|