慘淡人生,平淡生活

          The Feature Is Stupid

          關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略

          今天在TSS上又看到有人討論java多繼承的問題,是想起這個話題的原因。^_^


          java中任何類都默認繼承 Java.lang.Object,除非被另一個繼承覆蓋(override),hoho 俺一直這么稱呼override的,感覺更加貼切一些。
          請看以下代碼:

          package org.myth.test;

          public class SuperSon{
              
              SuperSon(){
                  System.out.println(
          "this is super son");
              }

          }

          對于編譯器來說,這段代碼會被首先補全為:

          package org.myth.test;

          public class SuperSon extends Object{
              
              SuperSon(){
                  System.out.println(
          "this is super son");
              }

          }

          對待任何一個類,編譯器會去檢查extends關(guān)鍵字,如果沒有,編譯器會默認添加extens Object

          extends Object就是一段默認隱藏的代碼,同樣在Constructor中,也有一段默認隱藏的代碼。

          package org.myth.test;

          public class SuperSon extends Object{
              
              SuperSon(){
                  
          super();//這就是一段默認隱藏代碼
                  System.out.println("this is super son");
              }

              //
          整個構(gòu)造方法也是一段默認隱藏代碼

          }

          如同編譯類時編譯器回去檢查extends關(guān)鍵字一樣,編譯器會首先檢查是否存在constructor,如果沒有,默認增加ClassName()構(gòu)造方法。
          在構(gòu)造方法內(nèi)部,編譯器會檢查第一行代碼是否為super構(gòu)造方法,如果不是,默認添加super()

          這個就是為什么 new一個對象的時候,首先調(diào)用的是父類的構(gòu)造方法。

          一個錯誤代碼示例:
          package org.myth.test;

          public class SuperMan {
              
              SuperMan(String s){
                  System.out.println(
          "this is super man");
              }

          }



          package org.myth.test;

          public class SuperSon extends SuperMan{
              
              SuperSon(){
                  System.out.println(
          "this is super son");
              }

          }


          嘿嘿 第一篇文章

          posted on 2008-05-28 10:44 季失羽 閱讀(1300) 評論(10)  編輯  收藏

          評論

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-28 11:11 Happy漫步者

          不錯 關(guān)注下^_^  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-28 11:13 Happy漫步者

          第一篇文章 我收藏拉   回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-28 11:40 隔葉黃鶯

          博主可由此延展一下,在父類沒有默認構(gòu)造函數(shù)時,對子類構(gòu)造函數(shù)有什么要求。  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-28 13:41 季失羽

          @隔葉黃鶯
          這個問題,你看我最后一個錯誤代碼示例 就知道了 ^_^  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略[未登錄] 2008-05-28 21:26 Matthew Chen

          黃鶯真的很認真啊。
          對于lz說的被另一個繼承覆蓋(override)的說法,怎么看得別扭,就是繼承自非object的類就好了,沒必要太復雜。  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-28 21:41 隔葉黃鶯

          最后一段錯誤代碼,你還沒有說明白錯誤的原因,也沒給出解決的辦法。

          只要知道子類和父類之間是一種 Has-A 的關(guān)系就好理解了,在父類沒有默認構(gòu)造方法時,在創(chuàng)建子類實例時,它就無從獲悉該如何實例化出它的部分--父類實例,super() 已經(jīng)不見效了,因為父類不存在 super() 了,所以就要求在子類的構(gòu)造方法中顯式的調(diào)用父類的某個構(gòu)造方法。  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-29 10:00 季失羽

          @隔葉黃鶯
          在構(gòu)造方法內(nèi)部,編譯器會檢查第一行代碼是否為super構(gòu)造方法,如果不是,默認添加super()
          按照上面這句話的理解 就是
          package org.myth.test;

          public class SuperSon extends SuperMan{

          SuperSon(){
          System.out.println("this is super son");
          }

          }

          其實等同于
          package org.myth.test;

          public class SuperSon extends SuperMan{

          SuperSon(){
          super();
          System.out.println("this is super son");
          }

          }

          顯然,父類中是不存在無參數(shù)構(gòu)造方法的,所以編譯器回報錯,不存在super()構(gòu)造方法。


          另外,對于您說的has-a的關(guān)系,特定界定之下可以這么講,但是更準確而言,子類是父類 應該是is a 的關(guān)系。  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-29 10:02 季失羽

          @Matthew Chen
          是,繼承另一個類也許更加清楚一些,但是 既然文章的主要意思是說默認實現(xiàn)與覆蓋關(guān)系的 hoho 這么說是一種慣性XD  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略 2008-05-29 12:28 隔葉黃鶯

          要繼承一個無默認構(gòu)造方法的父類,在子類中應如何處理還可以說明白一些

          其實只要記住這一點,在構(gòu)造子類實例前必須構(gòu)造一個父類實例作為子類實例的部分,所以從這一層面講存在一種 has-a 關(guān)系。

          在C++或某些具體面對象的C組件中很清楚體現(xiàn)這一點,父類實例要放在子類實例的首地址,所以才能保證向上安全轉(zhuǎn)型

          如果沒有默認增加ClassName()構(gòu)造方法?!∵@句話不是很好理解,沒有增加ClassName()構(gòu)造方法是人的行為,不存在是否默認

          關(guān)于對象模型,C++有些書籍講述的比較透沏。  回復  更多評論   

          # re: 關(guān)于extends 和 constructor的默認實現(xiàn)與覆蓋策略[未登錄] 2008-05-29 19:08 季失羽

          @隔葉黃鶯
          在構(gòu)造子類實例前必須構(gòu)造一個父類實例作為子類實例的部分
          這句話太正確了。

          如果沒有默認增加ClassName()構(gòu)造方法。
          暈,剛剛發(fā)現(xiàn),句讀錯了,中間有個逗號。汗一個 XD
          如果沒有,默認增加ClassName()構(gòu)造方法。

          其實 俺這篇文字 完全可以三句話說完的

          第一句,任何一個類都有Constructor
          第二句,任何一個類的Constructor第一行代碼就是調(diào)用父類的構(gòu)造函數(shù)
          第三局,就是 以上兩句說的東西,你可以代碼中不寫,因為有默認實現(xiàn),并且默認實現(xiàn)與編碼出來的實現(xiàn)不能并存,會被覆蓋。

          XD 騙字數(shù)而已 XD  回復  更多評論   


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 宁明县| 上思县| 玉门市| 偏关县| 九江县| 建昌县| 黄陵县| 湖北省| 滁州市| 定结县| 任丘市| 仙居县| 丰都县| 高碑店市| 柘荣县| 宜丰县| 平阴县| 文昌市| 惠水县| 项城市| 胶南市| 霍山县| 晋江市| 云林县| 美姑县| 河南省| 如东县| 西盟| 凯里市| 泗水县| 扎兰屯市| 南开区| 绥宁县| 霞浦县| 临夏县| 呼伦贝尔市| 罗甸县| 西乌珠穆沁旗| 吉林省| 长泰县| 从化市|