關於java中面型對象的三大特性---封裝,繼承,多態

面向對象的三大特性:
        封裝,繼承,多態

面向對象的三大特點:
        1.更符合我們平時的思維習慣
        2.把複雜的問題簡單化
        3.把我們從執行者變成指揮者
Java中使用類來描述事物
        類:一類事物的抽象
        對象:這類事物的實例(具體化)

關於封裝


        體現:
            1.方法的定義
            2.私有成員變量
            3.描述一個事物(定義一個類)
        好處:
            1.提高代碼的複用性
            2.提高代碼的安全性
            3.提高代碼的多樣性

關於私有成員變量:

用private修飾的成員變量就是私有成員變量.

private:權限修飾符 私有的
        修飾:成員變量和成員方法
        被修飾後 :被修飾的成員只能在本類中訪問;

關於類:

構造方法:
        格式:
            修飾符 類名(形式參數列表){
                方法體;
            }
        構造方法的作用:
            1.提供多種創建對象的方式
            2.在創建對象的同時給對象的屬性進行賦值
            3.在創建對象的同時完成某些功能(自己完成)
        構造方法的特點:
            1.若在一個類中不寫任何構造方法,JVM會默認給與一個無參構造方法;
            2.若在一個類中寫了任意一種構造方法,JVM提供的默認無參構造就沒有;
            
    new的過程做了哪些事情:
        1.創建一個對象
        2.調用了相應的構造方法
        3.在堆內存中開闢了空間
    
    創建對象的格式:
        類名 對象名 = new 類名(實際參數列表);
        
事物描述類的編寫步驟
    1.私有成員變量 -->寫屬性
    2.自動生成無參構造方法 
    3.自動生成含參構造方法
    4.自動生成getters and setters 方法
    5.若該類型的事物有行爲 你可以自行的編寫相應的成員方法

事物描述類的使用
    1.創建main方法(main方法不要寫在事物描述類中)
    2.創建對象
    3.對象調方法(對象調屬性)

關於繼承

    繼承:類與類之間的關係
    繼承的特點:單一繼承,多層繼承
    繼承的原則:子類繼承父類,子類可以使用父類中所有非私有的成員
    繼承的關鍵字: extends
    繼承的格式:
        public class 子類名 extends 父類名{
            
        }
        注意:當一個類沒有任何繼承關係的時候,默認繼承Object
            Object:根類,基類,超類 是所有類直接或者間接的父類
    繼承中成員變量的特點:
        只要有對象調屬性,編譯看左邊,運行看左邊;(看的是對象,看對象裏是否有這個屬性,後者 )
        -->就近原則
            當局部位置有該變量,優先使用局部位置的變量
            當局部位置和本類成員位置都有該變量,若要使用本類成員位置的變量: this.變量名
            當局部位置,本類成員位置和父類成位置都有該變量,若要使用父類成員位置的變量:  super.變量名
    繼承中成員方法的特點:
        只要有對象調方法,編譯看左邊,運行看右邊;(看的是對象,看對象裏是否有這個方法,或者父類裏有沒有這個方法)
        -->動態綁定:
            當子類中有該方法,執行子類的該方法;
            若子類中沒有該方法,去父類中找該方法,若有就執行,若沒有報錯!
    繼承中構造方法的特點:
        子類對象要加載要優先加載父類;  原因:有可能子類對象會使用到父類的成員;
        構造代碼塊:對象的預加載 -->爲對象的出生做準備
            什麼時候執行:只要new對象 就優先於構造方法執行構造代碼塊
            執行多少次:只要new 對象,new一次就執行一次構造代碼塊
        靜態代碼塊:類的預加載 -->驅動 -->爲類的加載做準備
            什麼時候執行:當這個類第一次被加載的時候執行;
            執行多少次:只在類第一次被加載的時候執行一次,優先於構造代碼塊優先於構造方法;
    
    super:本類父類對象的引用
    this:本類對象的引用
    
    this.變量名:調用本類中成員位置的該變量
    this.方法名:調用本類中的某個成員方法
    super.變量名:調用本類父類中成員位置的該變量
    super.方法名:調用本類父類中的某個成員方法
    this():調用本類中的無參構造方法,只是調用構造方法並沒有創建對象
    this(實際參數):調用本類中的含參構造方法,只是調用構造方法並沒有創建對象
    super():調用本類父類中的無參構造方法,只是調用構造方法並沒有創建對象
    super(實際參數):調用本類父類中的含參構造方法,只是調用構造方法並沒有創建對象
    
        super():
            1.當一個類的構造方法的第一行代碼沒有調用其他任何一個構造方法,默認存在一句super();(只能在構造方法的第一句)!
            2.若你在構造方法的第一句調用了任意某個本類或者父類的構造方法,默認存在的super()就不存在了!
            3.一個類中一定會有一個構造方法的第一句是在調用父類的構造方法!
            
    方法的重寫:
        當子類中出現了與父類中方法聲明完全一致的情況,稱爲方法的重寫; (除了權限修飾符)
        必須要求子類重寫方法:返回值類型相同,方法名相同,形式參數列表完全相同
        要求:子類重寫的方法權限修飾符要大於或者等於父類的該方法
            權限修飾符等級排名:  public > protected > 默認不寫 > private
        註解: @Override  -->檢查方法是否是重寫方法  -->最好加上

關於多態

多態:事物的多種形態
    多態的前提條件:
        1.必須有繼承關係
        2.必須有方法的重寫  -->動態綁定 (父引用調用的是子類重寫的成員方法)
        3.父類引用指向子類對象
    多態的格式:
        父類型 父類引用 = new 子類型();
    多態的成員特點:
        成員變量:只要有對象調屬性,編譯看左邊,運行看左邊;
        成員方法:只要有對象調方法,編譯看左邊,運行看右邊;
    多態的弊端:
        父類引用不能訪問子類特有的成員  我們可以通過向下轉型把父引用轉換成具體的子類對象;
    多態的應用:
        1.作爲容器的類型,當一個父類型的容器創建,該容器可以存儲該父類型所有子類型的對象
        2.把父類型作爲方法的形式參數,當調用此方法的時候可以傳入任意的子類對象; -->這種思想:接口回調
    
    引用數據類型間的類型轉換:
        前提:必須是子父類關係
        向上轉型: 子類 --> 父類    
            以多態的形式創建對象;
        向下轉型: 父類 --> 子類
            子類型 子類對象 = (子類型)父類引用;
            
    instanceof:專門判斷繼承關係中,對象是否是屬於某個類型
        格式:
            對象 instanceof 類名
        這個表達式的結果一定是boolean類型,一般作爲if語句的判斷,爲了避免代碼出現類型轉換異常(ClassCastException)
        
        ClassCastException:
            產生原因:兄弟類之間轉換
            解決辦法:
                使用關鍵字 instanceof 關鍵字提前判斷,若滿足條件再轉換

類的實例化內存圖:

這裏創建了一個Car的事物描述類,裏面定義了成員變量和成員方法.還創建了一個CarDemo,來實例化Car類,並實現Car類中的方法.

這裏,先加載了CarDemo.class到方法區,然後將main方法壓棧進棧,在棧裏開闢一塊空間,之後要實例化一個Car對象,那麼,Car.class文件加載到方法區,然後纔可以在堆內存中new一個Car,開闢一塊空間,在這個堆空間裏,加載Car類裏的成員變量,和成員方法在方法區的地址,然後調用了實例化對象的方法,c.run().

run()方法執行完後,就銷燬,然後調用c.isGas()方法,在棧內存中開闢一塊空間,給b傳入的參數是true. 

由圖可以看出成員方法是通過地址來找到的,每new一個對象,就會在堆中創造一塊空間,加載成員參數和成員方法的地址.方法一旦執行完畢,就會從棧內存中銷燬.

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