(三)面向對象的三大特徵

JAVA中面向對象的三大特徵:

    面向對象具有繼承性(Inheritance)

    面向對象具有多態性(Polymorphism)

    面向對象具有封裝性(Encapsulation)

一、繼承
多個類具有共同的屬性(成員變量)與行爲(成員方法)的時候,將這些共同的部分抽取出來定義到一個公共的類中,其他及各類可以與這個公共的類形成繼承關係,從而在多個類中不需要重 復定義公共部分!這個公共的類就是父類,也稱爲超類或者基類,其他的類就是子類。子類可以直接訪問父類的非私有化成員變量,訪問父類的私有化成員變量可以使用super.get()方法。
1、 Java繼承的特點:
A、Java只存在單個繼承不存在多個繼承,即:一個類只能有一個父類
B、Java可以多層繼承,多重繼承
2、Java繼承的優點
A、繼承是基於存在多個重複代碼的時候提出的,那麼繼承能很好的提高複用率!
B、使類與類之間存在繼承關係,是實現多態操作的前提!
C、繼承關鍵字:extends
3、Java繼承的缺點
A、繼承使得多個類之間具有了子父類關係,當一個類存在多個子類的時候,如果父類發生變化,那麼這些子
類會跟着一同變化,造成類與類之間的“強耦合”關係!
4、Java繼承注意點
A、不要僅僅爲了獲取某個類的某個功能而去繼承這個類
B、類與類之間要存在所屬關係,不能夠隨意繼承
例:人與狗都具有吃飯的動作,

     class Person 
           {
             public void eat(){}
           }
           class Dog extends Person
           {
             //此時爲了實現吃飯的動作,而繼承人,這是不合適的!
           }
                  所謂的所屬關係是is--a的關係,也就是說AAA is BB 的....
           class Person 
           {
             public void eat(){}
           }
           class Student extends Person
           {
             //學生是人的某一個羣體,可以同時具有吃飯的動作
           }

5、何時使用繼承
A、具有公共的屬性與行爲操作的時候,提高複用性
B、具有is–a的所屬關係的類與類之間
6、類的主要組成部分的子父類繼承關係中的特點!
A、成員變量
a、繼承關係中同名的子類成員變量、局部變量、父類的成員變量這三者之間
使用順序:
在具有相同變量名的這種情況下,不使用this、super等關鍵字進行調用時,即成員變量前什麼
都不寫調用順序按照由局部變量位置—當前類成員變量位置—父類成員變量位置
依次進行查找變量,什麼位置先有值,就會使用這個值!
調用方式:this,super
B、成員方法
a、繼承中的成員方法
使用順序:當子類具有與父類同名成員方法時,進行調用過程中不使用this、super等關鍵字,即成
員方法前什麼都不寫方法的有效順序:當前類的成員方法—父類的成員方法
子類中有方法實現,則按照子類的實現進行,若在子類中使用super調用了父類的方法,那
麼父類方法也要執行!但是默認成員方法內是沒有super調用的!!!
b、重寫
概念:子類中出現與父類一模一樣的方法時,會出現子類方法將父類方法覆蓋的情況,這種情況成爲重
寫或者複寫
c、重寫注意事項
- 父類中的私有方法不可以被重寫,覆蓋!
- 子類重寫父類方法後,繼續使用父類的方法時候,可以使用super調用
- 重寫時,子類的方法的訪問權限要大於或者等於父類成員方法的訪問權限
- 靜態方法只能被靜態方法覆蓋
- 子類對於父類的功能有增強需求的時候,可以重寫父類的方法以增強其功能!
d、重寫與重載的區別
重寫:子父類之間,方法完全相同(返回值、方法名、參數列表),
但是子父類之間的方法體必須不同,否則沒有意義!
重載:同一個類中,方法名相同,參數列表不同,與返回值無關!
(參數列表:包括兩項:參數個數,對應參數的數據類型)
重載何時使用:當一個類中需要完成某個相同功能,但是方法的參數不同需要分別進行操作時!

C、構造方法
a、子類中所有的構造方法默認都訪問父類中無參構造
b、每個構造方法的第一行是super();super(參數列表);如果把這兩行代碼放在非第一行位置會報錯
c、根據構造方法的特性,在手動給出任意一個構造方法的時候,之前默認的無參構造會被覆蓋,此時具有
繼承關係的時候,子類之前默認存在的每個構造都調用無參構造super();失效,
此時必須在每個構造方法中手動給出super(參數列表);的方式直接或間接調用之前手動在父類中給出
的構造!
d、構造方法執行了一定會創建相應對象嗎?
不一定,當具有繼承關係的類時,子類創建對象的時候會調用父類的構造方法,用來初始化父類的成員變
量這個時候父類的構造執行了,但是內存中並沒有父類的對象!
e、構造方法是否可以被重寫或者繼承?
不可以,因爲構造方法名需要與類名相同,假如出現繼承或者重寫關係,就會有子類中有一個與父類的類
名相同的構造方法,但是又由於構造方法需要與類名相同,此時子類類名需要與構造相同,這個時候就會
出現父類與子類的類名相同,父類類名==構造方法名==子類類名,不能存在同名的類!
二、多態
java程序中定義的引用變量所指向的具體類型和通過該引用類型發出的方法在調用時不確定,該引用變量發出的方法到底調用哪個類的實現的方法,必須在程序運行期間才能決定,這就是多態。
1、多態存在的前提
A.必須有子類和父類,具有繼承或實現
B.子類必須重寫父類的方法
C.父類的引用變量指向子類的對象
2、多態的優點
A. 可替換性,多態對一存在的代碼具有可替代性
B. 可擴充性:增加的子類不影響已存在的類的特性的運行和操作

C. 接口性:多態時超類通過方法簽名想子類提供了一個公共的接口,由子類來完善或者覆蓋它而實現的

D. 靈活性:在應用中體現了靈活多樣的操作,提高了使用的效率

E. 簡化性: 多態簡化對應用軟件的代碼的編寫和修改過程,尤其在處理大量的對象的運算和操作時,這個特點尤爲突出和重要

3、多態的缺點

A. 只能使用父類的引用訪問父類的成員
4、多態中的成員特點:
成員變量:編譯與運行時期都看父類!
成員方法:編譯時期看父類,運行時期看子類

package polymorphism.first;

/**
 * 這裏是一個動物的父類,其中有公共的方法
 * 用來完成動物公共的行爲
 *
 */
public class Animal {

    public String name;

    /**
     * 動物的公共行爲:吃飯
     */
    public void eat(){
        System.out.println("這裏是Animal類的eat");
    }
    /**
     * 這個方法是動物的公共行爲:活着
     */
    public void live(){
        System.out.println("這裏是Animal類的live");
    }
    public void live1(){
        System.out.println("這裏是Animal類的live1");
    }
    public void live2(){
        System.out.println("這裏是Animal類的live2");
    }

}
  package polymorphism.first;
/**
 * 這裏是爲了解決重複代碼過多的問題而創建的工具類,在這個類中將公共的代碼進行
 * 抽取,從而減少代碼重複度!
 *
 */
public class AnimalTool {

    /**
     * 對於貓的動作的抽取
     * @param ca
     */
    public static void doCat(Cat ca){

        ca.eat();
        ca.live();
        ca.live1();
        ca.live2();
    }
    public static void doDog(Dog dog){

        dog.eat();
        dog.live();
        dog.live1();
        dog.live2();
    }
    public static void doCat(Pig pig){

        pig.eat();
        pig.live();
        pig.live1();
        pig.live2();
    }

    /**
     * 以上這些方法僅僅是對某個子類的方法進行了抽取操作
     * 但是仍然重複度比較高
     * 更好思路:
     * 1、當前的這些類Animal、Cat、Dog、Pig之間是具有子父關係的,
     * 2、根據之前提起的“類型轉換”的思路,所有子類是歸屬於Animal這個大類的
     * 
     */

    /**
     * 將這些子類歸屬於同一個父類Animal
     * @param an
     */
    public static void doAnimal(Animal an){
        an.eat();
        an.live();
        an.live1();
        an.live2();
    }

}

package polymorphism.first;

/

**
 * 當前是一個測試類,用來測試Animal系列的類的多態操作!
 * @author HM
 *
 */
public class Test {

    public static void main(String[] args) {

        /**
         * 現在Animal與Cat、Dog之間構成了多態,子類繼承父類,同時對父類的eat方法進行了重寫
         * 現在要使用子類重寫後的show方法
         */
        Animal an1=new Cat();
        an1.eat();
        an1.live();
        an1.live1();
        an1.live2();
        System.out.println("============");
        Animal an2=new Dog();
        an2.eat();
        an2.live();
        an2.live1();
        an2.live2();
        System.out.println("============");

     }

}

三、封裝
所謂封裝指的是隱藏對象的屬性以及實現細節,僅對外提供訪問方式,將不需要對外提供的內容進行隱藏,把屬性隱藏對外提供訪問方式

2、封裝的優點
將變化隔離
便於使用
提高重用性
提高安全性

3、封裝的缺點:
將變量等使用private修飾,或者封裝進方法內,使其不能直接被訪問,增加了訪問步驟與難度!

3、封裝的實現形式
A、使用訪問權限修飾符private
在定義JavaBean時對於成員變量使用private進行修飾,同時對外提供set、get方法
使用了private修飾的成員在其他類中不能直接訪問,此時需要使用set、get方法進行。
對比:
對於成員變量直接使用public修飾與使用private修飾的區別
使用public修飾時,可以使用對象進行直接訪問,訪問方便但是不能添加校驗邏輯
使用private修飾時,需要提供set、get方法這個時候在set、get方法中可以書寫校驗
邏輯(if、else、for、while等這些邏輯控制操作必須寫在方法中)
B、定義一個Java類與Java的方法就是最簡單最常見的面向對象的封裝操作,這些操作符合隱藏
實現細節,提供訪問方式的思路
[本文內容轉載自此]:https://blog.csdn.net/Wei_HHH/article/details/74864628

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