Java 中的面向?qū)ο缶幊蹋悍庋b、繼承、多態(tài)、抽象
在本指南中,我們將通過現(xiàn)實(shí)生活中的例子討論面向?qū)ο缶幊痰乃膫€(gè)重要特性。
面向?qū)ο蟮姆椒ǎ航榻B
Java 是一種面向?qū)ο蟮恼Z言,因?yàn)樗峁┝藢?shí)現(xiàn)面向?qū)ο竽P偷奶匦浴_@些特性包括抽象、封裝、繼承和多態(tài)。
OOPS 是關(guān)于圍繞數(shù)據(jù)(即對(duì)象)開發(fā)應(yīng)用程序,允許對(duì)象以自己的方式訪問它們的屬性和可能的操作。
抽象
OOPs 最基本的概念之一是 抽象。抽象是一個(gè)過程,在這個(gè)過程中你只展示“相關(guān)”的數(shù)據(jù),并“隱藏”對(duì)象不必要的細(xì)節(jié)。例如,當(dāng)你登錄亞馬遜賬戶時(shí),你輸入你的用戶名和密碼并按下登錄按鈕,按下登錄按鈕后發(fā)生了什么,輸入的數(shù)據(jù)是如何發(fā)送到亞馬遜服務(wù)器的,如何驗(yàn)證的,所有這些都對(duì)用戶隱藏。
另一個(gè)抽象的例子:汽車本身是一個(gè)定義明確的對(duì)象,它由幾個(gè)較小的對(duì)象組成,例如變速系統(tǒng)、轉(zhuǎn)向機(jī)制、發(fā)動(dòng)機(jī)等,這些較小的對(duì)象又有自己的子系統(tǒng)。但是對(duì)于人類來說,汽車是一個(gè)完整的對(duì)象,可以通過其子系統(tǒng)來管理,即使它們的內(nèi)部細(xì)節(jié)是未知的。
封裝
封裝 是將數(shù)據(jù)與操縱它的代碼綁定在一起。它使數(shù)據(jù)和代碼免受外部干擾。
讓我們來看一個(gè)汽車的動(dòng)力轉(zhuǎn)向系統(tǒng)的例子。汽車的動(dòng)力轉(zhuǎn)向是一個(gè)復(fù)雜的系統(tǒng),內(nèi)部有許多緊密耦合在一起的組件,它們同步工作以將汽車轉(zhuǎn)向期望的方向。它甚至控制發(fā)動(dòng)機(jī)傳遞到方向盤的動(dòng)力。但是對(duì)外部世界來說,只有一個(gè)接口是可用的,其余的復(fù)雜性被隱藏。此外,轉(zhuǎn)向單元本身是完整且獨(dú)立的。它不會(huì)影響任何其他機(jī)制的運(yùn)行。
類似地,封裝的相同概念也可以應(yīng)用于代碼。封裝的代碼應(yīng)該具有以下特點(diǎn):
- 每個(gè)人都知道如何訪問它。
- 無論實(shí)現(xiàn)細(xì)節(jié)如何,都可以輕松使用。
- 代碼不應(yīng)對(duì)應(yīng)用程序的其余部分產(chǎn)生任何副作用。
封裝的理念是保持類分離,并防止它們之間緊密耦合。
Java 中的 java.util.Hashtable
類是封裝的一個(gè)例子。用戶只知道他可以將數(shù)據(jù)以鍵/值對(duì)的形式存儲(chǔ)在 Hashtable 中,并且可以通過多種方式檢索這些數(shù)據(jù)。但實(shí)際的實(shí)現(xiàn),例如這些數(shù)據(jù)是如何存儲(chǔ)的以及存儲(chǔ)在哪里,對(duì)用戶來說是隱藏的。用戶可以在任何需要存儲(chǔ)鍵/值對(duì)的地方簡單地使用 Hashtable,而不必關(guān)心其實(shí)現(xiàn)。
繼承
繼承 是一種機(jī)制,通過它一個(gè)對(duì)象獲得另一個(gè)對(duì)象的部分/全部屬性。它支持層次分類的概念。
例如:汽車是一種四輪車,所以假設(shè)我們有一個(gè) FourWheeler
類及其子類 Car
。這里,汽車獲得了 FourWheeler
類的屬性。其他分類可以是吉普車、卡車、面包車等。FourWheeler
定義了一類具有四個(gè)輪子的車輛,并具有特定范圍的發(fā)動(dòng)機(jī)功率、載重能力等。Car
(稱為子類)繼承了 FourWheeler
的這些屬性,并且還有一些與其他四輪車不同的特定屬性,例如豪華性、舒適性、形狀、大小、用途等。
汽車還可以有進(jìn)一步的分類,如敞篷車、小汽車、大汽車等,它們將繼承 FourWheeler
和 Car
的屬性,但仍會(huì)有一些特定屬性。通過這種方式,層次結(jié)構(gòu)可以擴(kuò)展到任何級(jí)別。
Java 中的 Swing
和 Awt
類是繼承的最佳示例。
多態(tài)
多態(tài) 意味著根據(jù)對(duì)象的數(shù)據(jù)類型不同地處理對(duì)象。換句話說,它意味著一個(gè)方法有多個(gè)實(shí)現(xiàn),具體使用哪種實(shí)現(xiàn)取決于運(yùn)行時(shí)的情況(即對(duì)象的數(shù)據(jù)類型)。
這可以通過設(shè)計(jì)一個(gè)通用接口來實(shí)現(xiàn),該接口為一類操作提供通用方法,并且可以有多個(gè)類提供這些通用方法的實(shí)現(xiàn)。
讓我們繼續(xù)使用汽車的例子。汽車有一個(gè)變速傳動(dòng)系統(tǒng)。它有四個(gè)前進(jìn)檔和一個(gè)倒檔。當(dāng)發(fā)動(dòng)機(jī)加速時(shí),取決于接合的是哪個(gè)檔位,不同的動(dòng)力和運(yùn)動(dòng)會(huì)傳遞到汽車。操作相同,都是換擋,但根據(jù)檔位的不同,操作表現(xiàn)不同,或者你可以說它顯示了多種形式(多態(tài)意味著多種形式)。
多態(tài)可以是靜態(tài)的也可以是動(dòng)態(tài)的。方法重載 是靜態(tài)多態(tài)性,而 方法重寫 是動(dòng)態(tài)多態(tài)性。
- 重載 簡單來說是指具有相同方法名但根據(jù)傳遞的參數(shù)不同而表現(xiàn)不同的方法。這被稱為靜態(tài)多態(tài)性,因?yàn)闆Q定調(diào)用哪個(gè)方法是在編譯時(shí)完成的。
- 重寫 意味著派生類實(shí)現(xiàn)了其超類的方法。對(duì)重寫方法的調(diào)用在運(yùn)行時(shí)解析,因此稱為運(yùn)行時(shí)多態(tài)性。
若你想提升Java技能,可關(guān)注我們的Java培訓(xùn)課程。