Java面向對象(類的封裝,繼承和多態)

 


面向對象:世間萬物皆對象:
    特性:封裝 繼承 多態
Java回收機制回收的是堆中的垃圾

類:
    概念:
        對一類事物的描述,引用類型,數據在堆中存儲
    靜態性的特徵描述:字段
    動態性的行爲描述:方法
    
對象(實例):
    客觀世界中真實存在的,某一類事物的某一個個體
    對象的屬性分配在堆內存中,但是對象名分配在棧內存中

    
一個類中的成員:
    1)字段(屬性,成員變量,全局變量):
        聲明:
            [訪問修飾符] 數據類型 變量名[=初始值];
        局部變量:
            在方法內部/方法中的參數或代碼塊中聲明,必須有初始值,生命週期與方法調用有關
        字段:
            在方法外面,類的內部進行聲明,可以沒有初始值,生命週期與對象有關
        默認初始化:
            整數型:0
            浮點型:0.0
            字符型:\u0000
            布爾型:false
            引用類型:null
        顯式初始化:
    2)方法:
        [訪問修飾符] 返回值 方法名([參數列表]) {方法體}
        返回值:
            無:void
            有:需要些返回值類型,必須由return語句
                return:必須保證每個條件分支都有return
                    return語句必須是可執行代碼的最後一句
        參數列表:
            實參=形參;
            參數傳遞:
                方式:
                    值傳遞,Java只有值傳遞
                        傳值(傳值類型的參數):
                            把實參的值賦值給形參,實參不隨着形參的變化而變化
                        傳引用(傳引用類型的參數):
                            把實參的值(引用類型的地址)賦值給形參,實參有可能隨着形參的變化而變化(重新new一個就不會變)
                        遞歸:自己調用自己
                            條件:
                                1)要有返回值
                                2)必須有臨界條件
                                斐波那契數列,漢諾塔
                        
    3)構造器(構造方法):構造對象,沒有構造器產生不了對象
        如果該類沒有寫構造器,系統默認提供一個公開的無參的構造器
        如果該類顯式編寫了構造器,系統將不再提供默認的構造器
        特徵:
            1)與類同名
            2)沒有返回值,也沒有void
            3)不能在方法中使用return
        聲明:
            [訪問修飾符] 類名([參數列表]) {初始化成員變量}
    4)內部類:內部類就是定義在另一個類的內部的類
        好處:
            1)對外可以隱藏外部類的細節
            2)對於內部類來說,外部類的所有成員均有訪問權限
            3)內部類可以模擬實現多繼承(接口和內部類)
            4)接口和父類中某個方法同名,通過內部類解決
        分類:
            1)成員內部類:
                1-1)實例內部類:
                    1)定義在方法外部,沒有static修飾的內部類稱爲實例內部類
                    2)在外部類中可以直接創建內部類對象
                    3)如果在其他類中創建內部類對象,必須先創建外部類的對象實例,然後在外部類實例的基礎上創建內部類對象實例
                        外部類.內部類 變量名=外部類對象實例.new 內部類();
                    4)內部類可以直接訪問外部類所有的成員,外部類如果想要訪問內部類的成員,必須創建內部類的對象實例,通過實例訪問
                    5)在內部類中不能定義靜態成員,只能定義實例成員
                    6)如果內部類中的成員或者局部變量和外部類成員同名: 
                        外部類名.this.成員名  表示外部類的成員
                        this.成員名 表示內部類的成員
                1-2)靜態內部類:
                    1)在方法外部用static修飾的內部類稱爲靜態內部類
                    2)靜態內部類可以直接訪問外部類中的靜態成員,如果需要訪問實例成員,則需要通過實例訪問
                    3)在其他類中創建內部類對象,可以直接new創建,不必通過外部類對象實例
                        外部類.內部類 變量名=new 外部類.內部類();
                    4)在靜態內部類中,可以定義靜態成員和非靜態成員
                    5)在其他類中可以通過完整的類名訪問內部類的靜態成員   外部類.內部類.靜態成員
            2)局部類:
                2-1)局部內部類:
                    1)在一個方法內部定義的內部類稱爲局部內部類
                    2)局部內部類只在方法內部可見,方法外部無法使用
                    3)局部內部類類似於局部變量,不能使用private/protected/public/static修飾
                    4)局部內部類中不能包含靜態成員
                    5)局部內部類可以直接訪問所有的外部類成員和方法內final類型的參數和變量
                2-2)匿名內部類:
                    
                    1)匿名類是一種沒有名字的特殊內部類
                    2)可以定義在方法的內部,也可以定義在方法的外部
                    3)匿名類本身沒有構造器,但是可以調用父類的構造方法
                    4)沒有訪問修飾符
                    5)父類或者父接口 變量名=new 父類或者父接口(){匿名類的成員}
                    6)A a = new A(){}
                        如果A是一個類或者抽象類,則相當於定義並創建了A類的子類的實例並賦值給A類型的變量(a是一個多態對象)
                        如果A是一個接口,則相當於定義並創建了一個實現A接口的類的實例並賦值給A類型的變量
                    7)lambda表達式:jdk1.8之後出現,只能是接口的
                        作用:
                            1)當做是一個匿名方法使用
                            2)允許我們將行爲傳遞到函數裏
                        語法:
                            (參數)->{//方法體}
    
垃圾回收機制:
    對象會被回收情況:
        1)對象的引用被置爲null
        2)使用的匿名對象
        3)超出生命週期
        
封裝: 
    步驟:
        1)將字段私有(private)
        2)公開getXxxxw()或者setXxxx()方法訪問該字段
        this:這個,代詞,誰調用就指誰
            區分成員變量和局部變量的,在成員變量前加this
    好處:
        1)隱藏類中的細節
        2)方便修改的實現
        3)只能通過規定的方法訪問
        
繼承:單繼承  一般類與特殊類之間的關係  耦合度最高
    子類的成員:
        1)繼承父類的可視化(非私有)的成員(字段/方法),構造器不能被繼承
        2)子類所特有的成員(字段/方法/構造器)
        3)重載父類的成員(方法)  ---編譯時多態(多態的一種)
            3-1)重載的條件:
                3-1-1):發生在統一個類或者父子類之間
                3-1-2):方法名稱相同,參數列表不同(數據類型/參數個數/參數順序),作爲判斷重載的條件
                3-1-3):返回值無所謂,可以相同也可以不同,不能作爲判斷重載的條件
                3-1-4):訪問權限無所謂
            3-2)重載的本質:
                兩個毫不相關的方法
            3-3)重載的調用:
                避免歧義重載,否則編譯錯誤
            3-4)構造器重載:
                3-4-1):this的2種用法: 指向本類的引用
                    a)this.成員:調用本類的方法和字段,誰調用指的是誰
                    b)this([參數列表]):調用本類其他的構造方法,根據參數列表來進行匹配,這句話必須在構造方法的第一句
        4)覆蓋[重寫]父類的成員(方法): 運行時多態
            4-1)覆蓋的條件:
                4-1-1):發生在父子類之間(繼承關係中)
                4-1-2):方法名稱相同,參數列表相同(參數的數據類型/參數的個數/參數的順序)
                4-1-3):返回值類型必須相同
                4-1-4):子類覆蓋方法的訪問權限必須大於父類被覆蓋方法的訪問權限
                4-1-5):子類不能拋出比父類異常類更大的異常(運行時異常例外)
            4-2)覆蓋的本質:
                替換
            4-3)super:指向父類的引用
                4-3-1)super.成員:調用父類的方法/字段
                4-3-2)super([參數列表]):super中的參數決定調用父類的哪一個構造器
                4-3-3)系統默認調用super();:調用父類中無參的構造器;如果父類沒有無參的構造器,則需要在子類的構造器中顯示調用super(參數列表)或者this(參數列表),否則報編譯錯誤
                4-3-4)super();只能出現在子類的構造器中,且必須是第一行
        PS:this和super不能在同一個構造器中同時出現
        5)隱藏父類的成員(字段/靜態方法):
            子類中定義了一個與父類中相同的字段(普通字段即可),那麼父類中的字段會被隱藏,普通方法不會隱藏,只會覆蓋,只有靜態方法會被隱藏,隱藏不會發生動態綁定
    
    多態對象:向上造型
        父類的對象指向子類的實例,該對象叫多態對象
        父類 對象名(多態對象) = new 子類();
    
        動態綁定:
            父類 對象名(多態對象) = new 子類();
            父接口 對象名(多態對象) = new 實現類();
                編譯時對象是父類的類型,運行時是子類的類型,所以是動態綁定,該對象不能直接調用子類所特有的成員
        多態對象:
            1)調用覆蓋的方法調用的是子類的;
            2)調用隱藏的成員,調用的是父類的
        多態存在的三個必要條件:
            1)要有繼承或實現
            2)要有重寫
            3)父類引用指向子類對象
        多態的優點:
            1)簡化代碼
            2)改善代碼的組織性和可讀性
            3)易於擴展
        多態的應用:
            方法的參數或者返回值使用父類的類型,數組中的元素是子類的類型
            Animal[] array = new Animal[3];
            array[0] = new Cat();
            array[1] = new Dog();
        
    繼承的好處:
        1)代碼重用,減少了代碼的冗餘
        2)使編碼更高效
        3)易維護
    繼承的缺點:
        1)耦合度比較高
    繼承的聲明方式:
        [訪問修飾符] class 子類 extends 父類 {成員}
        子類:派生類/孩兒類
        父類:原生類/超類/基類
    繼承的規則:
        1)Java中只支持單繼承,也就是說每個類只能有一個父類,不允許有多重繼承
        2)一個父類可以有多個子類
        3)子類繼承父類所有的屬性和方法
            子類繼承父類,擁有父類的所有屬性和方法,但是對於父類私有的(private),子類沒有使用權,只有擁有權
    繼承子類實例化過程:
        1)子類實例化時先實例化其父類,然後實例化子類
        2)要先調用父類的構造器,父類構造器運行完畢,才調用子類的構造器
        
        

格式良好的Java文件:
    [包聲明語句]; package 包名;
    [導包語句]*; import 包名;
    類聲明語句; class      public類只能有一個
    
    
包(package): 全部小寫(Internet的倒敘)      .  
    功能:
        1)有助於避免類名衝突問題
        2)包允許將類組合成較小的單元
        3)包允許在更廣的範圍內保護類/數據和方法
import:
    1)java.lang.*:默認包,默認自動導入;
    2)java.io.*:輸入輸出流;
    
    1)使用通配符*,是把當下包的所有的類都加載到內存,消耗內存
    2)導包時只能看到導入包下的類以及其子包,不能訪問子包下的類
    
類之間的關係:
    1)泛化(is-a):繼承.
    2)實現:
    3)組合(has-a):一個類作爲另一個類的成員變量
        3-1)合成:個體和整體的關係,生命週期相同
        3-2)聚合:個體和整體的關係,生命週期不同
        3-3)關聯:
    4)依賴(use-a):一個類作爲另一個類的方法的參數或者返回值
    
造型(引用數據類型(父子類)的轉換):
    1)向上造型:自動轉換   小(子類)-->大(父類)
    2)向下造型:強制轉換   大(父類)-->小(子類)
        如果能夠下轉型的對象必須經過上轉型,即多態對象.
    
    變量 instanceof 類[接口]          判斷變量所指向的實例是否是類[接口]的實例
    
訪問權限:
    private < default(friendly) < protected    < public
    有兩個訪問權限與包有關:default    protected
        1)private:只能本類訪問
        2)default:只能同一個包中訪問
        3)protected:同一個包中的類或者不同包的子類中可以訪問
        4)public:不論是不是同一個包的類都可以訪問
        
關鍵字:
    1)static:靜態的,類的,與對象無關   不能修飾局部變量
        1)字段(成員變量=實例變量):類變量/靜態變量
            特點:
                所有的對象共享
        2)方法:類方法/靜態方法,不需要實例化,可以直接訪問
            2-1)靜態方法可以直接訪問靜態成員,不能直接訪問非靜態的成員,如果需要訪問,則需要創建實例對象間接訪問
            2-2)非靜態方法可以直接靜態成員和非靜態成員
            2-3)靜態方法中不能有this和super關鍵字
        3)塊:靜態代碼塊/靜態塊
            語法:
                static{}
        特點:
            1)類一加載就執行,只執行一次,比構造器先執行,一個類中可以有多個,按照書寫順序執行
            2)非靜態代碼塊(實例代碼塊)也比構造器先執行,創建一個對象就執行一次,可以有多個,按照書寫順序執行
        初始化:
            1)實例變量初始化:聲明時/構造器
            2)靜態變量初始化:聲明時/靜態代碼塊
        4)內部類:
    2)final:終態的
        1)變量:常量,不能第二次賦值,必須要有初始值,聲明時或者構造器中賦值
        2)方法:不能被重寫
        3)類:不能被繼承 
    String類沒有子類,因爲是final修飾的
    3)abstract:抽象的
        抽象方法:只有方法的聲明,沒有方法的實現
        抽象類:
        1)抽象方法必須放在放在抽象類中,抽象類中不一定有抽象方法
        2)抽象類不能有實例
        3)抽象類有構造器,其構造器不能用來產生本類對象,在子類產生對象時,間接調用該構造器
        4)抽象類有父類,父類可以是抽象類,也可以是非抽象類
        5)抽象類中可以有抽象方法,也可以由非抽象的方法
        6)abstract不能與private/static/final一起使用
        7)抽象類的所有抽象方法需要在子類中重寫,如果只重寫一部分,則子類仍然是抽象類
        
     在下列情況下,一個類必須聲明爲抽象類:
        1)當一個類的一個或多個方法是抽象方法時
        2)當類是一個抽象類的子類,並且沒有實現父類的所有抽象方法,即只實現部分
        3)當一個類實現一個接口,並且不能爲全部抽象方法都提供實現時
    4)interface:標準/規範, 沒有構造器也沒有實例
        訪問權限:
            只能是public,默認public
        成員:
            常量: public static final 
            抽象方法:
            默認方法:有方法體,jdk1.8以上
        作用:
            模擬實現了多繼承,將毫無關係的類根據某個特徵關聯起來
        聲明:
            [訪問修飾符] interface 接口名 {}
        
        
類和類之間:單繼承 extends
類和接口之間:多實現 implements
接口和接口之間:多繼承 extends
    
單例模式:
    要點:
        1)某個類只能有一個實例
        2)它必須自行創建這個示例
        3)必須自行向整個系統提供這個實例

    步驟:
        1)構造器私有
        2)產生本類唯一一個靜態實例
        3)公開一個靜態的方法返回該實例
    
    
多例模式:負載平衡

接口和抽象類的相同點與異同點:
    相同點:
        1)都是抽象類型
        2)都可以有實現方法(以前接口不行,jdk1.8才支持)
        3)都可以不需要實現類或者繼承者去實現所有方法(以前不行,現在接口中的默認方法不需要實現者去實現)
    異同點:
        1)抽象類不可以多重繼承,接口可以(無論是多重類型繼承還是多重行爲繼承)
        2)抽象類和接口所反映出的設計理念不同,抽象類表示的是"is-a"的關係,而接口表示的是"like-a"的關係 
        3)接口中定義的變量默認是public static final型, 且必須給其初始值,所以實現類中不能重新定義,也不能改變其值;抽象類中的變量默認是friendly型,其值可以在子類中重新定義,也可以重新賦值


 

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