深入理解Java封裝、繼承、多態


轉載請注明原文地址:https://www.cnblogs.com/ygj0930/p/10830957.html

 

一:封裝

    將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問,常見的實現方式就是:getter、setter。

    封裝遵循了“開閉原則”,禁止外部直接訪問和修改類的信息。

 

    1、類變量、成員變量和局部變量

    類變量(靜態變量):用static修飾的變量稱為靜態變量,其內容被該類的所有對象共享,所有對象中這個類變量的值都指向相同的一處內存,隨便一個對象修改了此處內存的值都會影響其他對象。

    成員變量:在類定義時聲明的變量,隨着對象的建立而建立,隨着對象的消失而消失,存在於對象所在的堆內存中。

    局部變量:在函數中聲明的變量,只定義在局部范圍內,只在所屬的區域有效。存在於棧內存中,作用的范圍結束,棧幀釋放,變量就消失。

 

    2、成員變量以及方法作用域(可見性)——default、private、protected、public

     我們在定義成員變量和方法時,前面都會加上作用域修飾符(如果不加,默認為default)。

     不同修飾符作用下,該成員變量或方法的作用域是不同的:

     

 

    3、構造函數與默認構造函數

    構造函數是用來初始化對象的,一個類可以重載多個構造函數。

    需要注意的是:默認情況下,一個類會有一個默認的構造函數,這個構造函數沒有內容也沒有返回值,一般都略去不寫。

    但是,如果一個類定義了一個有參數有方法體的構造函數,這時編譯器就不會再給它默認加上一個無參且方法體為空的構造函數,可以理解為無參的構造函數被覆蓋,此時需要手動定義一個無參構造函數。

    在函數的繼承里,子類必須使用super來實現對父類的非默認構造函數的調用.在創建對象時,先調用父類默認構造函數,然后調用子類自身自己定義的構造函數。

 

二:繼承

    繼承是類與類的一種關系,子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有)從而實現了實現代碼的復用。

    繼承與實現的區別

    1)概念不同

       繼承:子類與父類的繼承。如果多個類的某個部分的功能相同,那么可以抽象出一個類出來,把他們的相同部分都放到父類里,讓他們都繼承這個類。

       實現:接口的實現。如果多個類都有一個行為,但是處理的方法方式不同,那么就定義一個接口,也就是一個標准,讓各個類分別實現這個接口,各自實現自己具體的處理方法。

    2)關鍵詞不同

       繼承:extends,實現:implements

    3)數量不同

       單繼承,多實現。

    4)屬性不同

       在接口中只能定義全局常量(static final),和空的方法體;而在繼承中可以定義屬性方法,變量,常量等...

    5)限制不同

       某個接口被類實現時,在類中一定要實現接口中的抽象方法;而繼承則無需。

    

 

三:多態

    Java中的多態主要指引用多態和方法多態。

    引用多態是指:父類引用可以指向本類對象,也可指向子類對象。引用多態的強大主要體現在調用屬性、方法時,可以根據引用具體指向的對象去調用,例如:子類中重寫了父類方法。

    方法多態:子類中可以重寫父類的方法,在調用方法時根據引用指向的子類對象決定調用哪個具體的方法。方法多態的強大主要體現在可以根據調用時參數的不同,而自主匹配調用的方法,例如:重載。

 

    方法重寫與重載的區別:

    重寫:一般發生在有繼承關系的子類中,子類中定義了一個方法,其 方法名、返回值類型、參數列表 與父類中某個方法一樣,此時就是子類中重寫(覆蓋)了父類的同名方法。

             父類引用調用方法時,根據引用指向的對象決定調用父類定義的方法還是子類定義的方法,這體現了多態。

    重載:發生在同一個類中,存在 多個方法的方法名相同,但是參數列表不同。參數列表不同指的是參數個數、參數類型或者參數的順序不同。

             調用方法時通過傳遞給它們的不同個數和類型的參數來決定具體使用哪個方法,這也體現了多態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM