java特性封裝、抽象、繼承、多態理論

封裝(Encapsulation)

首先,我們來看封裝特性。封裝也叫作信息隱藏或者數據訪問保護。類通過暴露有限的訪問接口,授權外部僅能通過類提供的方式(或者叫函數)來訪問內部信息或者數據。這句話怎麼理解呢?我們通過一個簡單的例子來解釋一下。

下面這段代碼是金融系統中一個簡化版的虛擬錢包的代碼實現。在金融系統中,我們會給每個用戶創建一個虛擬錢包,用來記錄用戶在我們的系統中的虛擬貨幣量。對於虛擬錢包的業務背景,這裏你只需要簡單瞭解一下即可。在面向對象的實戰篇中,我們會有單獨兩節課,利用OOP的設計思想來詳細介紹虛擬錢包的設計實現。

抽象(Abstraction)

講完了封裝特性,我們再來看抽象特性。 封裝主要講的是如何隱藏信息、保護數據,而抽象講的是如何隱藏方法的具體實現,讓調用者只需要關心方法提供了哪些功能,並不需要知道這些功能是如何實現的。

在面向對象編程中,我們常藉助編程語言提供的接口類(比如Java中的interface關鍵字語法)或者抽象類(比如Java中的abstract關鍵字語法)這兩種語法機制,來實現抽象這一特性。

這裏我稍微說明一下,在專欄中,我們把編程語言提供的接口語法叫作“接口類”而不是“接口”。之所以這麼做,是因爲“接口”這個詞太泛化,可以指好多概念,比如API接口等,所以,我們用“接口類”特指編程語言提供的接口語法。

繼承(Inheritance)

學習完了封裝和抽象兩個特性,我們再來看繼承特性。如果你熟悉的是類似Java、C++這樣的面向對象的編程語言,那你對繼承這一特性,應該不陌生了。繼承是用來表示類之間的is-a關係,比如貓是一種哺乳動物。從繼承關係上來講,繼承可以分爲兩種模式,單繼承和多繼承。單繼承表示一個子類只繼承一個父類,多繼承表示一個子類可以繼承多個父類,比如貓既是哺乳動物,又是爬行動物。

爲了實現繼承這個特性,編程語言需要提供特殊的語法機制來支持,比如Java使用extends關鍵字來實現繼承,C++使用冒號(class B : public A),Python使用paraentheses(),Ruby使用<。不過,有些編程語言只支持單繼承,不支持多重繼承,比如Java、PHP、C#、Ruby等,而有些編程語言既支持單重繼承,也支持多重繼承,比如C++、Python、Perl等。

爲什麼有些語言支持多重繼承,有些語言不支持呢?這個問題留給你自己去研究,你可以針對你熟悉的編程語言,在留言區寫一寫具體的原因。

多態(Polymorphism)

學習完了封裝、抽象、繼承之後,我們再來看面向對象編程的最後一個特性,多態。多態是指,子類可以替換父類,在實際的代碼運行過程中,調用子類的方法實現。

 

  • 1.關於封裝特性

封裝也叫作信息隱藏或者數據訪問保護。類通過暴露有限的訪問接口,授權外部僅能通過類提供的方式來訪問內部信息或者數據。它需要編程語言提供權限訪問控制語法來支持,例如Java中的private、protected、public關鍵字。封裝特性存在的意義,一方面是保護數據不被隨意修改,提高代碼的可維護性;另一方面是僅暴露有限的必要接口,提高類的易用性。

  • 2.關於抽象特性

封裝主要講如何隱藏信息、保護數據,那抽象就是講如何隱藏方法的具體實現,讓使用者只需要關心方法提供了哪些功能,不需要知道這些功能是如何實現的。抽象可以通過接口類或者抽象類來實現,但也並不需要特殊的語法機制來支持。抽象存在的意義,一方面是提高代碼的可擴展性、維護性,修改實現不需要改變定義,減少代碼的改動範圍;另一方面,它也是處理複雜系統的有效手段,能有效地過濾掉不必要關注的信息。

  • 3.關於繼承特性

繼承是用來表示類之間的is-a關係,分爲兩種模式:單繼承和多繼承。單繼承表示一個子類只繼承一個父類,多繼承表示一個子類可以繼承多個父類。爲了實現繼承這個特性,編程語言需要提供特殊的語法機制來支持。繼承主要是用來解決代碼複用的問題。

  • 4.關於多態特性

多態是指子類可以替換父類,在實際的代碼運行過程中,調用子類的方法實現。多態這種特性也需要編程語言提供特殊的語法機制來實現,比如繼承、接口類、duck-typing。多態可以提高代碼的擴展性和複用性,是很多設計模式、設計原則、編程技巧的代碼實現基礎。

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