十二、Java的繼承和多態

繼承是多態的前提,沒有繼承就沒有多態。安全

繼承主要解決的問題:共性抽取。ide

父類,也能夠叫基類,超類this

子類,也能夠叫派生類.net

繼承關係中,子類能夠擁有父類的內容,子類還能夠擁有本身專有的內容。子類就是一個父類,子類能夠被看成父類看待。子類is a父類。對象

格式:public classs 子類名稱 extends 父類名稱{}繼承

 

在父子類的繼承關係中,若是成員變量重名,則建立子類對象時,訪問有兩種方法:接口

直接經過子類對象訪問成員變量:get

    等號左邊是誰,就優先用誰,沒有則向上找編譯

間接經過成員方法訪問變量:class

    該方法屬於誰,就優先用誰,沒有則向上找

 

當局部變量,子類成員變量和父類成員變量三者都同名

局部變量              直接寫成員變量名

子類成員變量         this.成員變量名

父類成員變量         super.成員變量名

 

當子類成員方法和父類成員方法重名時,對象是誰,優先用誰,沒有時向上尋找。

 

子類重寫父類的成員方法:在繼承關係中,方法的名稱和參數列表都同樣,則發生重寫。

重寫的特色:建立的是子類對象,則優先使用子類方法

注意:一、能夠經過在方法前面添加註解@override,檢測是否是正確的覆蓋重寫

         二、子類方法的返回值必須小於等於父類方法的返回值

         三、子類方法的權限必須大於等於父類方法的權限,public->protected->private

 

在繼承關係中,父子類構造方法的訪問特色:

一、子類構造方法當中默認隱含一個super();,因此必定是先調用父類的構造,後執行子類的構造

二、子類構造能夠經過super關鍵字來調用父類構造的重載

三、super的父類構造調用必須是子類構造方法的第一個語句,一個子類只能調用一次父類的構造

 

總結:super關鍵字的三種用法:一、在子類的成員方法中,調用父類的成員變量

                                            二、在子類的成員方法中,調用父類的成員方法

                                            三、在子類的構造方法中,調用父類的構造方法

         this關鍵字的三種用法:一、在本類的成員方法中,調用本類的成員變量

                                         二、在本類的成員方法中,調用本類的成員方法

                                         三、在本類的構造方法中,調用本類的另外一個構造方法,若是有this,不能使用super,反之同樣。

 

Java繼承的三個特色:一、Java語言是單繼承的,一個類直接的父類只能有一個。

                              二、Java語句能夠多級繼承

                              三、一個子類的父類是惟一的,可是一個父類能夠擁有多個子類

 

抽象方法:若是父類當中的方法不肯定如何進行方法體的實現,那麼就應該是一個抽象方法

抽象方法的定義格式:在方法返回值前面加上abstract關鍵字,而後去掉大括號,直接分號結束。注意:抽象方法所在的類必須是抽象類才行,在class以前加上abstract便可。

如何使用抽象類和抽象方法的使用:一、不能直接使用new建立抽象類

                                                二、必須用一個子類來繼承抽象父類

                                                三、子類必須覆蓋重寫抽象父類當中全部的抽象方法

                                                四、建立子類對象進行使用

注意:一、抽象類中,能夠有構造方法,是供子類建立對象時,初始化父類成員使用的

         二、抽象類中,不必定包含抽象方法,可是抽象方法的類必須是抽象類

         三、抽象類的子類,必須重寫抽象父類中的全部的抽象方法,不然,編譯沒法經過,除非子類也是抽象類

 

接口(interface):一種公共的規範標準,是一種引用數據類型

定義一個接口: public interface 接口名稱{接口內容;}

接口中能夠包含的內容:一、常量

                                 二、抽象方法

                                 三、默認方法(Java8以上)

                                 四、靜態方法(Java8以上)

                                 五、私有方法(Java9以上)

擴展:一、接口當中的抽象方法修飾符都是public abstract ,而且能夠選擇性省略。public abstract 返回值類型 方法名稱(參數列表);

         二、接口默認方法的定義 public default 返回值類型 方法名稱(參數列表){方法體;},解決接口升級的問題。接口的默認方法能夠經過接口的實現類的對象直接調用,也能夠被實現類覆蓋重寫再調用。

         三、接口的靜態方法的定義:public static 返回值類型 方法名稱(參數列表){方法體;},不能經過接口實現類的對象調用靜態方法,應該經過接口名稱直接調用靜態方法。

        四、接口的私有方法分爲:一、普通私有方法 :private 返回值類型 方法名稱 (參數列表){方法體;},解決多個默認方法之間重複代碼的問題

                                           二、靜態私有方法:private static 返回值類型 方法名稱 (參數列表){方法體;},解決多個靜態方法之間重複代碼的問題

        五、接口的常量 : public static final 數據類型 常量名稱 = 數據值

 

 

接口不能直接使用

一、必須有一個實現類來實現該接口

public class 實現類名稱 implement 接口名稱{}

二、接口的實現類必須覆蓋重寫接口中的全部抽象方法。

三、建立實現類的對象,進行使用

注意:一、若是實現類沒有覆蓋接口中全部的抽象方法,那麼這個實現類本身必須是抽象類

         二、接口沒有靜態代碼塊和構造方法

         三、一個類的父類只有一個,可是一個類能夠同時實現多個接口。

         四、若是實現類所實現的多個接口中,存在重複的抽象方法,實現一次就好。

         五、若是實現類所實現的多個接口中,存在重複的默認方法,實現類必須覆蓋重寫重複的默認方法。

         六、一個實現類的父類方法和接口中的默認方法重複,優先使用父類方法。

接口的能夠多繼承的,多個父接口但在的抽象方法重複,不要緊,默認方法重複,子接口要覆蓋重寫一個同名的默認方法

 

多態:一個對象擁有多種形態,子類形態和父類形態

多態的使用:父類引用指向子類 父類名稱 對象名 = new 子類名稱() 或者 接口名稱 對象名 = new 實現類名稱()

當使用多態時訪問成員變量:一、直接經過對象名稱訪問成員變量,看等號左邊是誰,優先用誰,沒有則向上尋找

                                       二、間接經過成員方法訪問成員變量,看該方法屬於誰,優先用誰,沒有則向上尋找

在多態的代碼中,成員方法訪問的規則:看New的是誰,就優先使用誰,沒有則向上尋找

使用多態的好處:不管右邊new的時候換成哪一個子類對象,等號左邊調用方法都不會改變

對象的向上轉型:其實就是多態的寫法 父類名稱 對象名 = new 子類名稱();

注意:向上轉型必定是安全的,從小範圍到大範圍,一旦向上轉型爲父類,那麼就沒法調用子類特有的內容

對象的向下轉型:將父類對象還原成原本的子類對象, 子類名稱 對象名 = (子類名稱)父類對象

注意:必須保證對象原本建立的子類對象和向下轉型的對象一致。

instanceof關鍵字:判斷前面的對象能不能看成後面類型的實例 , 對象 instanceof 類名稱 ,返回一個boolean值。用來判斷是否能向下轉換。

 

final關鍵字:最終的,不可變的

四種做用:一、用來修飾一個類,public final class 類名稱{},表示當前的類不能有任何子類。

               二、用來修飾一個方法,public final 返回值類型 方法名 (參數列表){方法體},表示當前的方法不能被子類覆蓋重寫。

               三、用來修飾一個局部變量,final 數據類型 數據名稱 = 表達式 ,一次賦值,不能更改,常量,注意基本數據類型值不變,引用類型地址不變

               四、用來修飾一個成員變量,那麼這個變量照樣不變,可是由於成員變量具備默認值,因此用來final必須手動直接賦值或者構造方法賦值,且全部構造方法都進行了賦值。

 

四種權限修飾符:一、public 

                        二、protected

                        三、default 

                        四、private

對應的四種狀況:一、同一個類:四種權限修飾符都能訪問

                        二、同一個包:除了private 其餘均可以

                        三、不一樣的包子類:除了private 和default 其餘均可以

                        四、不一樣的包非子類:就public 能夠

 

內部類:一個類的內部包含另外一個類

分類:一、成員內部類

         二、局部內部類(包含匿名內部類)

成員內部類:修飾符 class 類名稱 {

                        修飾符 class 類名稱{}

}

注意:內部類使用外部類,能夠隨意訪問,外部類使用內部類必須使用內部類對象

使用內部類:一、在外部類的方法當中,使用內部類,而後在main只是調用外部類的方法

                  二、直接使用,外部類名稱.內部類名稱  對象名 = new 外部類名稱().new 內部類名稱()

內部類同名變量訪問:若是出現重名的現象,使用外部類名稱.this.變量名稱 訪問外部類成員變量。

局部內部類:只有當前所屬的方法才能使用它,出了這個方法外面就不能用

修飾符 class 外部類名稱{

        修飾符 返回值類型 外部類方法名 (參數列表){

                    class 局部內部類名稱{

}

}

}

注意:局部內部類若是但願訪問所在方法的局部變量,那麼這個局部變量必須是有效final。(final可寫可不寫,可是局部變量必須不能改變)

類的權限修飾符:

外部類: public /default

成員內部類:public /protected/ private/default

局部內部類:什麼都不寫

 

匿名內部類:若是接口的實現類或者父類的子類,只須要使用一次,這種狀況下就能夠省略掉該類的定義,而改成使用匿名內部類

定義格式: 接口名稱 對象名 = new 接口名稱 (){須要覆蓋的方法;}

相關文章
相關標籤/搜索