黑馬程序員Java-面向對象篇下《二》

                   ——Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ——

1.繼承的概念

  • 面向對象的特點之一,可以實現對類的複用。可以通過以下兩種方法實現

  •       a.合成/聚合關係(包含其他類):將一個類當作另一個類的屬性。

  •       b.派生類:一個類繼承另一個類,實現繼承的類稱爲派生類,被繼承類稱爲父類,基類,超類。

  • 父類的成員方法和成員變量被子類繼承,但是父類的構造方法沒有被繼承。

  • 在Java中只支持單繼承,和C++多繼承不一樣。

2.super關鍵字

  1.super可以訪問父類的成員變量

  2.super可以調用父類的成員方法

  3.super可以在子類構造方法裏調用父類的構造方法

  注意:super只能在成員方法和構造方法裏使用,不能在static方法裏使用(和this一樣),

              在構造方法中使用必須放在第一行。

3.this和super關鍵字比較(都不能在static方法中調用)

        

4.方法覆蓋

  1. 方法覆蓋只存在子類和父類之間

  2. 子類覆蓋父類的方法時,訪問權限不能縮小,可以擴大,其他寫法一樣

  3. 父類的靜態方法不能被子類覆蓋爲非靜態方法

5.訪問權限

   類的訪問修飾符

  1. public:任何包中的類(即一切的類)都可以訪問該類

  2. 默認值:同一包中的類可以訪問該類

   成員的訪問修飾符

  1. private:只對本類可見,對子類不可見

  2. 默認值:對同一包中的類可見

  3. protected:對同一包中的類和所有子類可見

  4. public:對一切類可見

  注意:訪問成員的前提是首選能訪問成員所在的類       

 6.重寫和重載的比較

    

7.對象的多態性

    多態是指引用類型在不同情況下的多種形態,也可以理解爲通過指向父類的指針調用不同子類中覆蓋的方法

  • 一個基類的引用類型變量可以"指向"其子類的對象。

  • 一個基類的引用不可以訪問其子類中新增加的成員(屬性和方法)。

  • instanceof : 對象 instanceof  類名/接口   //判斷該對象是否是該類/該類的子類/實現該接口。

  • 子類對象可以當作父類對象來使用稱爲向上轉型,反之稱爲向下轉型。

8.抽象類和抽象方法(abstract)

      抽象類(abstract修飾):任何聲明爲abstract的抽象類無法實例化,除非其子類全部覆蓋其抽象方法,

                                     這樣子類就不是抽象類,不一定要包含抽象方法,但是有抽象方法的類必須聲明爲抽象類。

      抽象方法(abstract修飾):沒有方法體的成員方法。不可以用abstract修飾構造方法。

      抽象類的子類:1.抽象父類有抽象方法:

                              a.非抽象的子類:子類覆蓋重寫父類所有的抽象方法

                              b.抽象的子類:父類中的抽象方法只要有一個沒有覆蓋重寫而繼承了必須聲明爲abstract類

                          2.抽象父類沒有抽象方法:

                              a.非抽象的子類:不用abstract修飾子類且不添加抽象方法即可(此時可以實例化)

                              b.抽象的子類:可以用abstract修飾,或者添加抽象方法再聲明爲抽象類。

       注意:抽象方法被可視化的修飾符修飾的只有兩個即public ,protected,即除了"默認訪問修飾符"

              "public","protected"修飾抽方法,其餘的(private ,static ,final)不可以修飾。

9.abstract,final,static比較

     

10.接口(interface)

    接口:比抽象類還抽象的抽象類,是抽象方法和常量值的定義的集合。沒有變量和方法的實現。

    接口常量:默認public static final 屬性(注意:不接受其他修飾符), type name=value;

    接口方法:默認public abstract 屬性(注意:不接受其他修飾符),returnType methodName (paramlist)

    接口的實現類(implements):實現接口的類必須覆蓋所有接口的方法,否則成爲抽象類。可實現多個接口

    接口的好處:

  • 解決了Java的單一繼承帶來的侷限性,也解決了C++多重繼承帶來的問題,

  • 多重繼承的危險會導致子類繼承同一方法的不同實現。而接口裏的方法都沒有實現,所以多重繼承的問題。

  • 通過接口實現不相關類的相同行爲,而無需考慮這些類之間的關係。

  • 通過接口瞭解對象的交互界面,而無需瞭解對象所對應的類

11.抽象類和接口的比較

    

12.多態性

        封裝是爲了保護屬性的操作,繼承是爲了擴展類的功能

        多態是由封裝性和繼承性引出面向對象程序設計語言的另一個特徵。

        多態的體現:方法的重載和重寫

     1.1 靜態多態性(編譯時多態):由方法重載(overload)實現

     1.2 動態多態性(運行時多態):子類對象可以作爲父類對象使用,有方法重寫(overridder)實現

13.對象的多態性

      對象的多態性主要分爲兩種:

         1.向上轉型:

                  父類  父類對象=子類實例;//程序自動完成

           注意使用規則:

           操作的是父類對象,所以無法訪問子類新增加的成員(屬性和方法)

           子類中覆蓋的方法和同名的成員變量

                a.成員變量(包括靜態的變量)和靜態成員方法:編譯和運行都看左邊(看父類的)

                b.非靜態的成員方法:編譯看左邊的,運行看右邊的(子類覆蓋的方法)。

         2.向下轉型:

                  子類 子類對象=(子類)父類對象;//需要強制轉換 

14.內部類(等價於一個非靜態的成員方法即不可聲明static變量)

         在類的內部裏再定義另外一個類,則這個類稱爲內部類。

         外部類的成員被內部類所知,而內部類的成員不被外部所知,只能實例化內部類來訪問其成員

    優點:可以方便的訪問外部類的私有屬性(最大優點),減少編譯後字節碼文件的大小

    缺點:使程序結構不清晰。

14.1 成員內部類(即實例內部類)

  • 成員內部類中不能定義static變量

  • 成員內部類持有外部類的引用

  • 文件管理方面:編譯後會產生“外部類名$內部類名.class”的文件

  • 外部實例化類的格式:

  •    Outer out=new Outer(); Outer.Inner  in=out.new Inner();

14.2 靜態內部類(外部類)

        用static聲明的內部類,稱爲靜態內部類,相當於外部類。可以通過外部類.內部類來訪問

  • 靜態內部類不會持有外部類的引用。創建時可以不用創建外部類。

  • 靜態內部類可以訪問外部的靜態變量,如果要訪問外部類的成員變量必須通過實例化外部類訪問

  • 外部實例化類的格式

  •        Outer.Inner   in=new Outer.Inner();

14.3 局部內部類(在方法中定義的內部類)

  • 可以訪問外部類的成員,要想訪問方法中局部變量必須爲final類型纔可以訪問

  • 局部內部類不能加private ,protected,public中任一個修飾符

  • 不能包含靜態成員。

14.4 匿名內部類

  • 如果一個內部類在整個操作中只使用一次的話,可以定義爲匿名內部類

  • 沒有名字的內部類,這是Java爲了方便我們編寫程序而設計的一個機制。有時候有的內部類

  • 只需要創建一個對象即可,以後再也不會用到這個類了。

  • 匿名內部類是在抽象類和接口的基礎上發展起來的。它可以是繼承某個類,或是實現某個接口

  • 在文件管理上:編譯後會產生“外部類名$編號.class”,編號爲1,2,3....n,表示第幾個匿名內部類

     格式:

      new 父類或者抽象父類或者接口名()

      { 實現方法}.調用相應的方法;

總結:

   多態:非靜態方法-編譯時看左邊,運行時看右邊。靜態方法和成員變量-都看左邊

   (非靜態)內部類:相當於一個非靜態的方法,不能在裏面定義靜態變量,且內部類默認持有外部類的引用。

   (靜態)內部類:相當於外部類,不持有外部類的引用。

   靜態代碼塊->構造代碼塊->構造方法



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章