Java的三大特性之繼承、封裝和多態

Java繼承與多態

一、Java中的繼承
1、繼承的作用
Java是一個面向對象的編程語言,因此我們將很多事物用其相關特徵描述出來,這就是。一個類就相當於一個對象的模板,需要用到具體的對象時我們通過類來實例化(new)出對象,然而對於很多對象他們存在一定的共性,例如蘋果和香蕉這兩個對象都屬於水果,他們具有水果的相同特性而又有着屬於本身的特性,如果對每一個對象都寫一個對應的類,那麼我們無疑會寫很多重複的代碼,比如蘋果和香蕉的類,我們會重複寫水果的屬性和方法,對此我們有了繼承 (IS-A的關係)。
2、繼承的實現
繼承可以使得你可以定義一個通用的類(即父類),之後擴充該類爲一個更加特定的類(即子類)。在Java術語中,如果類A1擴展自另一個類A2,那麼就將A1稱爲次類(子類),將A2稱爲超類(父類/基類)。 子類從它的父類中繼承可訪問的數據域和方法,還可以添加新數據域和新方法。

實現:public class A1 extends A2{ //A1繼承A2 }

例如:我們對於蘋果和香蕉這兩個對象的描述可以寫三個類,水果類(父類)、蘋果類(子類)、香蕉類(子類)。蘋果類和香蕉類共同繼承其父類水果,因此他們不必重新寫水果的共同特性,只需要寫自己本身的私有特性。
3、繼承的數據訪問規則

  • 父類的私有數據域不能被子類直接訪問,唯一方式是子類通過父類私有數據的get和set等公有方法訪問數據。

  • Java中子類對父類是單一繼承,也就是說子類只能夠繼承一個父類,如果想要實現多繼承,可以採用實現接口的方式,即implements後跟接口名,多個接口間實現使用逗號分離。

  • 關鍵字super指代父類,可以用於調用父類中的普通方法和構造方法。父類的構造方法不會被子類繼承。它們只能使用關鍵字super從子類的構造方法中調用。調用父類構造方法的語法是:super(),或者super(parameters);super()調用父類的無參構造方法,而super(arguments)調用與參數匹配的父類的構造方法。語句super()和super(arguments)必須出現在子類構造方法的第一行,這是顯示調用父類構造方法的唯一方式。

  • 成員變量隱藏:是指在子類中定義了一個與直接超類的某個成員變量同名的成員變量,從而使超類中的那個成員變量不能直接被子類繼承。這時候子類使用簡單的變量名訪問只會訪問到本身的成員變量,在超類中訪問也只會訪問到超類本身的成員變量,那麼如何在子類中訪問到超類中和本身已有的同名成員變量呢,我們有如下方法:

    super.<變量名> // 在子類類體裏,訪問直接超類中被隱藏的成員變量

    ((<超類名>)<子類實例引用>).變量名 //訪問指定超類中被隱藏的成員變量

    <超類名>.<變量名> //訪問指定超類中被隱藏的類變量

  • 子類對父類方法的重寫(Override)
    a、方法名稱要一樣
    b、返回值數據類型要一樣
    c、所使用的參數列表要一樣,參數列表包括參數個數及每個參數的數據類型,不包括參數的變量名
    d、訪問修飾符只能越來越開放,不能越來越封閉
    對於方法的重寫,我們通常使用@Override關鍵字標註。

  • 泛化:抽取調整代碼到父類的過程,稱爲泛化,即子類可以選擇完全重寫或者在父類方法中補充。

public void test() {
		super.test();    //調用父類的實現
		System.out.println(" 增加部分 " );                                                                 
	}
  • 子類和父類的代碼執行順序:
    父類靜態代碼塊和靜態變量(代碼塊:最先執行的代碼)
    子類靜態代碼塊和靜態變量
    父類代碼塊和普通變量
    父類構造函數
    子類代碼塊和普通變量
    子類構造函數

二、Java的多態

1、什麼是多態
程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因爲在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。
2、多態的特性

  • 使用父類類型的引用實例出子類的對象
  • 該引用只能調用父類中定義的方法和變量
  • 如果子類中重寫(覆蓋)了父類中的一個方法,那麼在調用這個方法的時候,將會調用子類中的這個方法
  • 變量不能被重寫(覆蓋),重寫只針對方法,如果在子類中重寫了父類的變量,編譯時會報錯

3、多態的實現(繼承、重寫、向上轉型)
繼承:在多態中必須存在有繼承關係的子類和父類。
重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。
向上轉型:在多態中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調用父類的方法和子類的方法。
只有滿足了上述三個條件,我們才能夠在同一個繼承結構中使用統一的邏輯實現代碼處理不同的對象,從而達到執行不同的行爲。

例如:

public classFruit {  //父類-水果
    public void fun1(){
        System.out.println("這是水果的fun1");
        fun2();
    }
    
    public void fun2(){
        System.out.println("這是水果的fun2");
    }
}

public class Apple extends Fruit{
    /**
     * @desc 子類重載父類方法
     * 父類中不存在該方法,向上轉型後,父類是不能引用該方法的
     */
    public void fun1(String a){
        System.out.println("蘋果 的 Fun1...");
        fun2();
    }
    
    /**
     * 子類重寫父類方法
     * 指向子類的父類引用調用fun2時,必定是調用該方法
     */
    public void fun2(){
        System.out.println("蘋果 的Fun2...");
    }
}

public class Test {
    public static void main(String[] args) {
        Fruit a = new Apple();  //多態
        a.fun1();
    }
}
--------------------------------------------------------------------------------------------
Output:
這是水果的fun1
蘋果 的Fun2...

在多態中,當子類重寫父類的方法被調用時,只有對象繼承鏈中的最末端的方法纔會被調用

三、Java的封裝
封裝是把過程和數據隱藏起來,對數據的訪問只能通過已定義的接口。面向對象始於封裝這個概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。封裝是一種信息隱藏技術,在java中通過關鍵字private,protected和public實現封裝。什麼是封裝?封裝把對象的所有組成部分組合在一起,封裝定義程序如何引用對象的數據,封裝實際上使用方法將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度。 適當的封裝可以讓程式碼更容易理解和維護,也加強了程式碼的安全性。
在平時寫一個類時,我們可以將相應的屬性用private關鍵字修飾,然後給這些屬性寫上對應的get和set方法,這樣,我們外部不能夠直接訪問該對象的相關屬性,但是我們可以通過它的get和set等公有的方法訪問這些屬性,這就是封裝。

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