天天看點

Java 你的多繼承納?

  java省略了許多很少用到,缺乏了解,混淆功能的c + +,在我們的經驗中帶來更多的悲傷大于收益 。

                                                                                                            -----james gosling                                           

                james gosling 這個人大家應該很熟悉,就是最初設計java 語言的的程式員,被稱為“java之父”,現在也有50多歲了,前幾天還看過他的視訊,很平易近人的一個白頭老人,可能和在中國小鎮随處可見的老人是一樣的,完全看不出是那 sun 的副總裁,也沒有中國商人特有的做秀和狡黠。

               上面那段話是别人問到他關于 java 為什麼不能運算符重載(雖然它确實有方法重載),多重繼承,以及廣泛的自動強制轉換時回答的一段話。他老人家說多繼承會帶來更多的悲傷,這悲傷到底在什麼地方納?以下是我自己的一點分析(如有不正,希望大神你出手):

Java 你的多繼承納?

             多繼承的優點是顯而易見的,一個子類能有多個父類的屬性和方法,比如上面的那個希臘神話當中的半人馬先生,繼承了人和馬,上半身是人的軀幹,包括手和頭,下半身則是馬身,也包括軀幹和腿,既有速度又有思維和抓取東西的能力。

            但是多繼承的缺點也是一點就破:

           (1)如果一個子類繼承的多個父類中擁有相同名字的執行個體變量,子類在引用該變量時将産生歧義,無法判斷應該使用哪個父類的變量;

           貼段代碼給看看:    

Java 你的多繼承納?
Java 你的多繼承納?

       (ps:上面這段代碼是不能編譯的,我是舉個例子而已)  classc到底會列印same還是unsame納?

        (2)如果一個子類繼承的多個父類中擁有相同方法,子類中有沒有覆寫該方法,那麼調用該方法時将産生歧義,無法判斷應該調用哪個父類的方法;

        貼段代碼看看:

Java 你的多繼承納?
Java 你的多繼承納?

      (ps:上面這段代碼是不能編譯的,我是舉個例子而已)  classc到底會調用上面哪個父類的printour()方法?

         上面的這些都是緻命的歧義,是以java中禁止一個類繼承多個父類;

         但是那個白頭發的老人在很多年前就給 java提供了接口,并能通過接口的功能獲得多繼承的許多優點而又摒棄了類與類多繼承的缺點。

         這到底是怎們做到的納?嗯,好了,我們也來詳細的分析一下:

         java允許一個接口繼承多個父接口,也允許一個類實作多個接口,而這樣的多繼承有上面提到的缺點嗎?

         因為有接口的抽象性,是以答案肯定是沒有;

        1)在接口中不能有執行個體變量,隻能有靜态的常量,每個靜态的常量在程式開始運作前都已經初始化成功,如果有重命名的出現,編譯器先生會及時的告訴你的;

        2)接口中不能有具體的方法(包含方法體),隻能有抽象方法,具體的方法隻能由實作接口的類實作,在調用的時候也隻會調用實作類的方法,這樣是不會存在歧義的;

          那門開篇的那半人馬就可以這樣來寫了:

Java 你的多繼承納?
Java 你的多繼承納?

      (ps:上面這段代碼是可以編譯通過的)

       因為引入了接口,是以程式員有很大空間的想象力,這可能就是java吸引許多人的魅力之一了。

如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】 

如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】 

如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】 

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。 

轉載:http://www.cnblogs.com/java-class/archive/2013/05/20/3087871.html