更好的閱讀體驗:Java 封裝、繼承、多態的理解
1.封裝
封裝:就是隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。讓使用者知道的才暴露出來,不需要讓使用者知道的全部隱藏起來
封裝的好處:避免使用者直接操作屬性值,隱藏類的實現細節;讓使用者只能通過程序員規定的方法來訪問數據;可以方便的加入存取控制語句,限制不合理操作,提高程序安全性。
1.1.封裝的實現
Java是使用“訪問控制符”來控制哪些細節需要封裝的,哪些細節需要暴露的。
Java中有4種訪問控制符,分別為private,default,protected,public。它們說明了面向對象的封裝性,所以我們編寫代碼的時候,盡可以讓訪問權限降到最低,從而提高安全性。
訪問修飾符作用范圍
private
被private修飾的屬性和方法,只能在所在類內部訪問,不能被其他類訪問,子類不能繼承也不能訪問。
default(缺省)
變量或者方法前沒有訪問修飾符時,可以被所在類訪問,可以被同一包內的其他類訪問或者繼承。但是不能被其他包訪問。
protected
被protected修飾的方法和屬性,在同一包內可被訪問和繼承。不同包內,子類可繼承,非子類不能訪問。
public
方法和屬性前有public修飾,可以被任意包內的類訪問。
另外,類要想被其他包導入,必須聲明為public。被public修飾的類,類名必須與文件名相同。
2.繼承
繼承是類與類之間的關系,與現實世界中的繼承(例如孩子繼承父母基因)類似。
繼承可以理解為一個類從另一個類獲取方法和屬性的過程。
例如:類B繼承於類A,那么B就擁有A的部分方法和屬性(private修飾或不在同一個包default修飾的無法訪問)。
2.1.繼承的實現
通過使用關鍵字 extends 來實現繼承。
方法重寫(Override)
有繼承才有重寫,重寫就是將父類的方法重新寫一遍--重新實現為需要的功能。
只有能繼承的方法才可以重寫,重寫時只能改花括號“{}”里面的內容。
重寫的意義是:不同的子類有着差異化的功能實現,是父子類之間的多態性的一種表現。
方法重載(Overload)
重載指的是在同一個類中存在多個具有不同參數個數或者類型的同名方法。
所有方法都可以重載,包括構造方法。
重載的意義是:讓類以統一的方式處理不同類型數據的一種手段,是一個類中多態性的一種表現。
2.2.繼承的優缺點
優點
- 多態特性,父類引用可以指向多個子類實例對象
- 相互關聯,共享特性
缺點
- 父類變,子類就必須變
- 繼承破壞了封裝,對於父類而言,它的實現細節對與子類來說都是透明的
- 繼承是一種強耦合關系
- Java中是單繼承,子類只能有一個爸爸,和真實的世界一樣你就一個爸爸
如果只是共享特性,那可以使用組合來解決繼承(在子類中new 父類,把父類當作是子類的屬性來使用)-- 強耦合不具備多態特性
3.多態
多態是同一個行為具有多個不同表現形式或形態的能力。
3.1.多態分類和實現
-
編譯時多態(靜態多態):方法重載實現的多態
-
運行時多態(動態多態):類繼承/接口實現 + 重寫 + 向上轉型實現的多態
基於繼承/接口來實現的多態:面向接口的方式編程為的就是可以使用多態的特性讓編程變得更加靈活。
3.2.多態的優點
消除類型之間的耦合關系
- 可替換性
- 可擴充性
- 接口性
- 靈活性
- 簡化性
3.3.向上轉型
將一個父類的引用指向一個子類的對象,稱為向上轉型。向上轉型是自動完成的。
向上轉型后,通過父類引用變量調用的方法是子類覆蓋或繼承父類的方法,不是父類的方法。但通過父類引用變量無法調用子類特有的方法。
例如:可是使用以下多種引用來指向該對象。
不同的對象指向相同的引用:雖然都是list集合,但有着不同的實現。
查看一下 List、ArrayList和LinkedList 等依賴關系:ArrayList 和 LinkedList 直接和間接都實現了List 接口。
3.4.向下轉型
將子類引用指向父類的對象,稱為向下轉型。向下轉型是強制完成的。
向上轉型無法使用子類特有的方法,如果非要使用這些特有方法,那么又得向下轉型,再使用子類的特有方法。
例如:將List 對象強制轉換為ArrayList,需要使用"(ArrayList)"來完成強轉。