面向對象編程
- OOP,全稱 Object Oriented Programming
- 兩個基礎概念:類(class)和對象(object)
- 一種編程範式或編程風格。它以類或對象作爲組織代碼的基本單元,並將封裝、抽象、繼承、多態四個特性,作爲代碼設計和實現的基石
面向對象編程語言
- OOPL,全稱 Object Oriented Programming Language
- 支持類或對象的語法機制,並有現成的語法機制,能方便地實現面向對象編程四大特性(封裝、抽象、繼承、多態)的編程語言
對象分析(OOA)Object Oriented Analysis
面向對象設計(OOD)Object Oriented Design
面向對象編程和麪向對象編程語言之間的關係
- 不用面向對象編程語言,照樣可以進行面向對象編程
- 使用面向對象編程語言,寫出來的代碼也不一定是面向對象編程風格
面向對象編程的優勢
- 更能應對大規模複雜程序的開發,程序的處理流程並非單一的一條主線,而是錯綜複雜的網狀結構
- 具有更加豐富的特性(封裝、抽象、繼承、多態)。利用這些特性編寫出來的代碼,更加易擴展、易複用、易維護
- OOP 語言更加人性化、更加高級、更加智能
三大特性 or 四大特性
封裝、抽象、多態 or 封裝、抽象、繼承、多態
封裝
也叫作信息隱藏或者數據訪問保護。類通過暴露有限的訪問接口,授權外部僅能通過類提供的方式來訪問內部信息或者數據。它需要編程語言提供權限訪問控制語法來支持,例如 Java 中的 private、protected、public 關鍵字。封裝特性存在的意義,一方面是保護數據不被隨意修改,提高代碼的可維護性;另一方面是僅暴露有限的必要接口,提高類的易用性。
抽象
主要講如何隱藏信息、保護數據,那抽象就是講如何隱藏方法的具體實現,讓使用者只需要關心方法提供了哪些功能,不需要知道這些功能是如何實現的。抽象可以通過接口類或者抽象類來實現,但也並不需要特殊的語法機制來支持。抽象存在的意義,一方面是提高代碼的可擴展性、維護性,修改實現不需要改變定義,減少代碼的改動範圍;另一方面,它也是處理複雜系統的有效手段,能有效地過濾掉不必要關注的信息。
繼承
表示類之間的 is-a 關係,爲了實現繼承這個特性,編程語言需要提供特殊的語法機制來支持,繼承主要是用來解決代碼複用的問題。
多態
子類可以替換父類,在實際的代碼運行過程中,調用子類的方法實現。多態這種特性也需要編程語言提供特殊的語法機制來實現,比如繼承、接口類、duck-typing。多態可以提高代碼的擴展性和複用性,是很多設計模式、設計原則、編程技巧的代碼實現基礎。
典型的非面向對象代碼
- 濫用 getter、setter 方法
- 濫用全局變量和全局方法,Constants 類、Utils 類
- 將類的數據和方法分離,基於貧血模型的開發模式
爲什麼容易寫出面向過程風格的代碼?
- 完成一個任務,一般都會思考,應該先做什麼、後做什麼,如何一步一步地順序執行一系列操作,最後完成整個任務
- 面向過程編程風格符合這種流程化思維方式
- 面向對象的編程的底層方法就是面向過程的,去完成什麼功能
抽象類和接口存在的意義
- 抽象類是對成員變量和方法的抽象,是一種 is-a 關係,是爲了解決代碼複用問題
- 接口僅僅是對方法的抽象,是一種 has-a 關係,表示具有某一組行爲特性,是爲了解決解耦問題,隔離接口和具體的實現,提高代碼的擴展性
基於接口而非實現編程
- 意圖是將接口和實現相分離,封裝不穩定的實現,暴露穩定的接口
- 不需要把每個類設計成接口
- 在定義接口的時候,一方面,命名要足夠通用,不能包含跟具體實現相關的字眼;另一方面,與特定實現有關的方法不要定義在接口中
多用組合少用繼承
- 繼承是面向對象的四大特性之一,用來表示類之間的 is-a 關係,可以解決代碼複用的問題。雖然繼承有諸多作用,但繼承層次過深、過複雜,也會影響到代碼的可維護性。在這種情況下,我們應該儘量少用,甚至不用繼承
- 通過組合、接口、委託三個技術手段來達成繼承的作用,還能解決層次過深、過複雜的繼承關係影響代碼可維護性的問題
- 類之間的繼承結構穩定,層次比較淺,關係不復雜,使用繼承即可
圖:思維導圖
【Java學習資源】整理推薦
【Java面試題與答案】整理推薦