熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java中的構造函數繼承

2022-06-13   來源: Java核心技術 

  專家讀書筆記希望能夠對大家學習java有所幫助

  每個子類構造方法的第一條語句都是隱含地調用super()如果父類沒有這種形式的構造函數那麼在編譯的時候就會報錯

  這句話怎麼理解

  所有代碼都經過測試測試環境

  java   version   rc

  Java(TM)      Runtime   Environment   Standard   Edition   (build   rcb)

  Java   HotSpot(TM)   Client   VM   (build   rcb   mixed   mode)

  如大家發現任何錯誤或有任何意見請不吝賜教

  缺省構造函數的問題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(){

  Systemoutprintln( base   constructor );

  }

  }

  class   derived   extends   base{

  derived(){

  Systemoutprintln( 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(){

  Systemoutprintln( base   constructor );

  }

  base(int   i){

  Systemoutprintln( base   constructor   int   i );

  }

  }

  class   derived   extends   base{

  derived(){

  Systemoutprintln( derived   constructor );

  }

  derived(int   i){

  Systemoutprintln( derived   constructor   int   i );

  }

  public   static   void   main(String[]   args){

  derived   d=new   derived();

  derived   t=new   derived();

  }

  }

  D:javathinkingthink> java   derived

  base   constructor

  derived   constructor

  base   constructor

  derived   constructor   int   i

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

  class   base{

  //   base(){

  //   Systemoutprintln( base   constructor );

  //   }

  base(int   i){

  Systemoutprintln( base   constructor   int   i );

  }

  }

  class   derived   extends   base{

  derived(){

  Systemoutprintln( derived   constructor );

  }

  derived(int   i){

  Systemoutprintln( derived   constructor   int   i );

  }

  public   static   void   main(String[]   args){

  derived   d=new   derived();

  derived   t=new   derived();

  }

  }

  D:javathinkingthink> javac   derivedjava

  derivedjava::   cannot   resolve   symbol

  symbol   :   constructor   base   ()

  location:   class   base

  derived(){

  ^

  derivedjava::   cannot   resolve   symbol

  symbol   :   constructor   base   ()

  location:   class   base

  derived(int   i){

     errors

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

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

  如下例

  class   base{

  //   base(){

  //   Systemoutprintln( base   constructor );

  //   }

  base(int   i){

  Systemoutprintln( base   constructor   int   i );

  }

  }

  class   derived   extends   base{

  derived(){

  super();

  Systemoutprintln( derived   constructor );

  }

  derived(int   i){

  super(i);

  Systemoutprintln( derived   constructor   int   i );

  }

  public   static   void   main(String[]   args){

  derived   d=new   derived();

  derived   t=new   derived();

  }

  }

  D:javathinkingthink> java   derived

  base   constructor   int   i

  derived   constructor

  base   constructor   int   i

  derived   constructor   int   i

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

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


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27071.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.