面向過程的優點是性能比面向對象高,不需要面向對象的實例化;缺點是不容易維護、復用和擴展。面向對象的優點是具有封裝、繼承、多態的特性,因而容易維護、復用和擴展,可以設計出低耦合的系統;缺點是由于需要實例化對象,因此性能比面向過程低。
~
本篇主要記錄內容包括:面向對象的概念、封裝、繼承、多態
- 上一篇內容:Java基礎:Java類與對象
- 下一篇內容:Java基礎:Java抽象接口
- 更多知識學習:全網最全的 Java 技術棧內容梳理(持續更新中)
文章目錄
- 一、面向對象的概念
- 1、面向對象和面向過程的區別
- 2、對象和類
- 3、面向對象的一般步驟
- 二、特性:封裝
- 1、概述
- 2、訪問控制符
- 三、特性:繼承
- 1、概述
- 2、繼承的特點
- 3、方法的重寫(覆蓋)
- 四、特性:多態
- 1、概述
- 2、注意事項
- 3、編譯時多態(方法重載`overload`)與方法簽名
- 4、運行時多態
- 5、向上轉型與向下轉型
一、面向對象的概念
1、面向對象和面向過程的區別
- 面向過程:將問題分解成步驟,然后按照步驟實現函數,執行時依次調用函數。數據和對數據的操作是分離的。
- 面向對象:將問題分解成對象,描述事物在解決問題的步驟中的行為。對象與屬性和行為是關聯的。
面向過程的優點是性能比面向對象高,不需要面向對象的實例化;缺點是不容易維護、復用和擴展。
面向對象的優點是具有封裝、繼承、多態的特性,因而容易維護、復用和擴展,可以設計出低耦合的系統;缺點是由于需要實例化對象,因此性能比面向過程低。
Java面向對象的三大特性:封裝,繼承,多態
2、對象和類
- 對象是現實世界中可以明確標識的實體,對象有自己獨有的狀態和行為。對象的狀態由數據域的集合構成,對象的行為由方法的集合構成。
- 類是定義同一類型對象的結構,是對具有相同特征的對象的抽象。類是一個模板,用來定義對象的數據域和方法。可以從一個類創建多個對象,創建對象稱為實例化。
3、面向對象的一般步驟
- 先按照名詞提煉問題領域中的對象
- 對對象進行描述,其實就是在明確對象中應該具備的屬性和行為
- 通過
new
的方式,創建該事物的具體對象(對象實例化) - 通過該對象調用它以后的功能
二、特性:封裝
1、概述
封裝(Encapsulation
)是指一種將抽象性函式接口的實現細節部分包裝、隱藏起來的方法,也可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問,要訪問該類的代碼和數據,必須通過嚴格的接口控制。
外部調用者無需修改或者關心內部實現,內部細節對外部調用透明,外部調用無需修改或關心內部實現
封裝的優點: 隱藏細節、減少耦合、便于理解與維護、加強了代碼的安全性等
2、訪問控制符
Java 提供了三種訪問權限,準確的說還有一種是默認的訪問權限,加上它一共四種。
private
: 在當前類中可訪問,使用對象:變量、方法。 注意:不能修飾類(外部類);default
:在當前包內和訪問,不使用任何修飾符。使用對象:類、接口、變量、方法;protected
: 在當前類和它派生的類中可訪問,使用對象:變量、方法。 注意:不能修飾類(外部類);public
: 公眾的訪問權限,誰都能訪問,使用對象:類、接口、變量、方法
修飾符 | 訪問級別 | 同類 | 同包 | 子類 | 不同包 |
---|---|---|---|---|---|
public | 公開 | O | O | O | O |
protect | 受保護 | O | O | O | X |
default | 默認 | O | O | X | X |
private | 私有 | O | X | X | X |
三、特性:繼承
1、概述
繼承: 從一個已知的類中派生出一個新的類,新類可以擁有已知類的行為和屬性,并且可以通過覆蓋/重寫來增強已知類的能力,子類共性的方法或者屬性直接采用父類的,而不需要自己定義,只需要擴展自己的個性化
通過 extends 關鍵字,可以聲明一個子類繼承另外一個父類,子類可以直接訪問父類的非私有化成員變量,訪問父類的私有化成員變量可以使用super.方法()
,
繼承的優點:提高代碼的復用性、提供了多態的前提、為多態做鋪墊等
繼承的初始化順序:父類的靜態代碼塊 -> 子類的靜態代碼塊 -> 父類的構造代碼塊 -> 父類的無參構造方法 -> 子類的構造代碼塊 -> 子類的無參構造方法
2、繼承的特點
- 通過子類對象既可以調用自身的非
private
修飾的成員,也可以調用父類的非private
修飾的成員 - 父類不可以訪問子類特有成員,即使是共有的
- 子類的對象調用成員變量的時候,子類自己有,使用子類,子類自己沒有則調用父類,出現了同名的成員變量時,在子類中需要訪問父類中非私有成員變量時,需要使用
super
關鍵字 - 子類的對象調用方法的時候,子類自己有,使用子類,子類自己沒有調用的父類,出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為
override
重寫、復寫或者覆蓋
3、方法的重寫(覆蓋)
有繼承關系的子類 中, 子類覆蓋父類的方法
方法覆蓋的前提是,參數列表、方法名必須相同,返回值類型如果是基本數據類型則必須相同,如果是引用數據類型,則可以時返回值父類方法的返回值的子類類型
注意:
- 方法的重寫(override)需方法名相同,參數類型相同
- 子類返回類型小于等于父類方法返回類型;
- 子類拋出異常小于等于父類方法拋出異常;
- 子類訪問權限大于等于父類方法訪問權限;
- 如果父類方法訪問修飾符為private則子類不能重寫該方法;
- final 修飾的方法不允許在子類中覆蓋;
- 父類被覆蓋的方法的參數列表中被聲明為 final 的參數,在子類的覆蓋方法的中可以不必指定為 final;
- 靜態方法不能被覆蓋,只能被隱藏;
四、特性:多態
1、概述
多態: 是指對象的多種形態,封裝和繼承幾乎都是為多態而準備的。
Java中多態的代碼體現在一個子類對象(實現類對象)既可以給這個子類(實現類對象)引用變量賦值,又可以給這個子類(實現類對象)的父類(接口)變量賦值,最終多態體現為 父類引用變量可以指向子類對象
多態調用的三種格式:
- 普通類多態定義的格式:
父類 變量名 = new 子類();
- 抽象類多態定義格式:
抽象類 變量名 = new 抽象類子類();
- 接口多態定義的格式:
接口 變量名 = new 接口實現類();
多態的優點:提高代碼的可維護行、提高代碼的擴展性
2、注意事項
- 多態分為編譯時多態和運行時多態,Java中的多態一般是運行時多態;
- 必須有子父類關系或者類實現接口關系,否則無法完成多態;
- 同一個父類的方法會被不同的子類重寫。在調用方法時,調用的為各個子類覆蓋后的方法;
- 當變量名指向不同的子類對象時,由于每個子類覆蓋父類方法的內容不同,所以會調用不同的方法
- 多態中成員訪問的特點:編譯看左邊,運行看左邊
3、編譯時多態(方法重載overload
)與方法簽名
因為對于方法重載而言,雖然多個方法的方法名相同,但是我們的編譯器,可以根據方法調用代碼推斷出,所要調用的那個方法的方法簽名,從而根據方法簽名(jvm
唯一的),確定要調用的方法
注:方法簽名: 方法名+方法參數列表
4、運行時多態
因為在編譯器編譯的時候,無法知道,具體調用的是哪個方法的代碼,只有當jvm
具體真正執行到調用代碼的地方,jvm
才能知道調用的究竟是哪個方法
實現運行時多態:繼承、方法覆蓋/重寫(override)、父類引用指向子類對象
5、向上轉型與向下轉型
# 向上轉型
- 當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。(也叫:隱式轉型、自動轉型);
- 格式:
父類類型 變量名 = new 子類類型();;
- 什么時候使用:當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,這時就可以使用向上轉型
# 向下轉型
- 一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的;
- 格式:
子類類型 變量名 = (子類類型) 父類類型的變量;
; - 什么時候使用:當要使用子類特有功能時,就需要使用向下轉型;
- 向下轉型的好處:可以使用子類特有功能;
- 但是弊端是需要面對具體的子類對象;
- 在向下轉型時容易發生
ClassCastException
類型轉換異常。在轉換之前必須做類型判斷
# instanceof 關鍵字
- 作用: 可以通過
instanceof
關鍵字來判斷是否能夠對象轉化。也就是,一個引用型的變量,是不是這個類型的對象,提高向下轉型的安全性; - 格式:
boolean b = 對象 instanceof 數據類型;
,返回true / false
注意:
null instanceof <類名>
結果永遠是false