<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| 天堂在线免费观看| 亚洲啪啪综合AV一区| 香港a毛片免费观看 | 在线亚洲人成电影网站色www| 美女被爆羞羞网站在免费观看 | 黄色网址大全免费| 亚洲av无码国产精品色在线看不卡 | 久久久久国产亚洲AV麻豆| 亚洲免费无码在线| 亚洲AV午夜福利精品一区二区 | 永久免费av无码不卡在线观看| 亚洲一级高清在线中文字幕| 久久精品a一国产成人免费网站| 亚洲已满18点击进入在线观看| 免费毛片在线看片免费丝瓜视频| 亚洲AV无码国产一区二区三区 | 国产亚洲精品一品区99热| 无码av免费网站| 亚洲人成7777影视在线观看| 曰皮全部过程视频免费国产30分钟 | 91老湿机福利免费体验| 亚洲人成综合在线播放| 国产成人高清精品免费软件| 又粗又长又爽又长黄免费视频| 国产AV无码专区亚洲AV毛网站| 99久久人妻精品免费二区| 亚洲人成人网站18禁| 亚洲另类激情专区小说图片| 日本免费一区二区三区四区五六区| 日本亚洲免费无线码| 国产亚洲精品AA片在线观看不加载| 久久99国产乱子伦精品免费| 色偷偷噜噜噜亚洲男人| 亚洲国产美女精品久久久久∴ |