做者:伯特
出處:github.com/ruicbAndroi…
聲明:本文出自伯特的《LoulanPlan》,轉載務必註明做者及出處。java
剛學習 Java 那會就接觸了「面向對象」的概念,但當時並無太多實戰經驗,因此對其的理解也僅限於概念。當工做兩年後再回顧一下,有些概念可以落地了,遂記錄一下,做爲 LoulanPlan 的開篇。git
面向對象是一種程序設計的思想,而不是一種方法,亦或準則。其指導咱們從現實世界中客觀存在的事物出發,進行程序設計。github
Everything is Object,在 Java 語言的世界中,萬事萬物皆對象。上面提到「從現實世界中客觀存在的事物出發」,這裏客觀存在的事物,咱們稱之爲「對象」。編程
在程序中,對象是程序的基本構成單元,是客觀存在的事物的體現。一個對象一般由一組屬性和對這組屬性進行操做的若干服務(方法)構成。bash
面對簡單的軟件程序,咱們每每不須要考慮過多的設計,任何一個小的功能單元或模塊,均可以按照必定的步驟去實現,這種 step by step 的方式即爲面向過程。ide
隨着程序的複雜性提高,咱們沒法按步驟去描述並實現編碼,因此面向過程已沒法適應。加之考慮到代碼的可讀及複用性等,便有了對象的概念,以及面向對象的編程思想。學習
固然,還有面向組件、面向服務等設計思想,不在此討論。ui
要知道,兩者並非非此即彼,而是相輔相成的。編碼
面向對象思想要求咱們從宏觀上進行程序設計,抽象出一個個「對象」。而面向過程,則在微觀上對「對象」內部進行具體的實現。spa
能夠看出,面向對象最終仍是離不開面向過程。
舉例來講,須要編程實現繪製圓形、三角形、矩形。
面向過程實現:
drawCircle... //一坨繪製相關的代碼,下同
drawTriangle
drawRect
複製代碼
面向對象實現:
//抽象出畫筆對象
class Painter {
drawCircle(){
//上述面向過程實現,下同
}
drawTriangle(){}
drawRect(){}
}
//面向對象,使用畫筆繪製
1. painter.drawCircle() //此處只須要調用對象的方法,下同
1. painter.drawTriangle()
2. painter.drawRect()
複製代碼
前面介紹了對象以及面向對象,下面回到 Java 中聊聊類
的概念。
咱們常說「物以類聚」,表達「 同類的東西聚在一塊兒」。其實 Java 中的類也能夠這麼去理解:「物」即客觀存在的「對象」,同類物體的特徵描述,即爲「類」。
上面是個人我的理解,用術語歸納就是:類是客觀事物的抽象,或者說是對現實生活中事物的一種描述(屬性和行爲)。
例如前面定義的 Painter 類,是對客觀事物畫筆的抽象,包含了一些繪製的方法(行爲)。
類進行實例化可生成對象,因此,類的具體表現或者實例就是對象,而對象的抽象或者總歸納就是類。
說到面向對象,就不得不說其三大特性:封裝、繼承和多態。
下面簡單說說本身的理解吧,就再也不貼相關示例了,網上有不少優秀的例子。
封裝是面向對象最基礎的特性。在前面介紹對象時,提到「一個對象一般由一組屬性和對這組屬性進行操做的若干服務(方法)構成」,這裏的構成體現的就是封裝性。
封裝,是指對外隱藏對象內部的屬性和實現細節,只提供相應的接口和方法進行交互。一方面,外部只需專一於對象所提供的能力,而不用關心內部實現細節;另外一方面,避免了外部隨意修改或訪問內部屬性和方法,從而提高了程序的健壯性;同時,封裝能提高代碼的複用率。
繼承指一個對象從另外一個對象中得到屬性和方法的過程,繼承者稱爲子類,被繼承者稱爲父類。繼承使得子類對象擁有父類對象的所有屬性與方法(非私有)。
Key point:
多態是在繼承的基礎上實現的,多態實現的三個必要條件:
當使用多態方式調用方法時,會依據如下規則:
多態的好處:可使程序有良好的擴展,並能夠對全部類的對象進行通用處理。
以上是本文的所有內容,但願能對你有所啓發。內容說不上全面、無誤,還望讀者朋友補充、指正。
最後,感謝閱讀。