作者:伯特
出處:github.com/ruicbAndroid/LoulanPlan
宣告:本文出自伯特的《LoulanPlan》,轉載務必註明作者及出處。
剛學習 Java 那會就接觸了“物件導向”的概念,但當時並沒有太多實戰經驗,所以對其的理解也僅限於概念。當工作兩年後再回顧一下,有些概念能夠落地了,遂記錄一下,作為 LoulanPlan 的開篇。
1. 什麼是物件導向
物件導向是一種程式設計的思想,而不是一種方法,亦或準則。其指導我們從現實世界中客觀存在的事物出發,進行程式設計。
2. 什麼是物件
Everything is Object,在 Java 語言的世界中,萬事萬物皆物件。上面提到“從現實世界中客觀存在的事物出發”,這裡客觀存在的事物,我們稱之為“物件”。
在程式中,物件是程式的基本構成單元,是客觀存在的事物的體現。一個物件通常由一組屬性和對這組屬性進行操作的若干服務(方法)構成。
3. 物件導向與程式導向的出現
面對簡單的軟體程式,我們往往不需要考慮過多的設計,任何一個小的功能單元或模組,都可以按照一定的步驟去實現,這種 step by step 的方式即為程式導向。
隨著程式的複雜性提升,我們無法按步驟去描述並實現編碼,所以程式導向已無法適應。加之考慮到程式碼的可讀及複用性等,便有了物件的概念,以及物件導向的程式設計思想。
當然,還有面向元件、面向服務等設計思想,不在此討論。
4. 物件導向與程式導向的區別
要知道,二者並不是非此即彼,而是相輔相成的。
物件導向思想要求我們從巨集觀上進行程式設計,抽象出一個個“物件”。而程式導向,則在微觀上對“物件”內部進行具體的實現。
可以看出,物件導向最終還是離不開程式導向。
舉例來說,需要程式設計實現繪製圓形、三角形、矩形。
程式導向實現:
drawCircle... //一坨繪製相關的程式碼,下同
drawTriangle
drawRect
物件導向實現:
//抽象出畫筆物件
class Painter {
drawCircle(){
//上述程式導向實現,下同
}
drawTriangle(){}
drawRect(){}
}
//物件導向,使用畫筆繪製
1. painter.drawCircle() //此處只需要呼叫物件的方法,下同
1. painter.drawTriangle()
2. painter.drawRect()
5. 物件與類
前面介紹了物件以及物件導向,下面回到 Java 中聊聊類
的概念。
5.1 類
我們常說“物以類聚”,表達“ 同類的東西聚在一起”。其實 Java 中的類也可以這麼去理解:“物”即客觀存在的“物件”,同類物體的特徵描述,即為“類”。
上面是我的個人理解,用術語概括就是:類是客觀事物的抽象,或者說是對現實生活中事物的一種描述(屬性和行為)。
例如前面定義的 Painter 類,是對客觀事物畫筆的抽象,包含了一些繪製的方法(行為)。
5.2 物件與類的關係
類進行例項化可生成物件,所以,類的具體表現或者例項就是物件,而物件的抽象或者總概括就是類。
6. 物件導向的三大特性
說到物件導向,就不得不說其三大特性:封裝、繼承和多型。
下面簡單說說自己的理解吧,就不再貼相關示例了,網上有很多優秀的例子。
6.1 封裝
封裝是物件導向最基礎的特性。在前面介紹物件時,提到“一個物件通常由一組屬性和對這組屬性進行操作的若干服務(方法)構成”,這裡的構成體現的就是封裝性。
封裝,是指對外隱藏物件內部的屬性和實現細節,只提供相應的介面和方法進行互動。一方面,外部只需專注於物件所提供的能力,而不用關心內部實現細節;另一方面,避免了外部隨意修改或訪問內部屬性和方法,從而提升了程式的健壯性;同時,封裝能提升程式碼的複用率。
6.2 繼承
繼承指一個物件從另一個物件中獲得屬性和方法的過程,繼承者稱為子類,被繼承者稱為父類。繼承使得子類物件擁有父類物件的全部屬性與方法(非私有)。
Key point:
- 子類也可以被其他類繼承成為父類;
- 父類可以擁有多個子類,但一個子類只能有一個父類。這一點與現實中父親與孩子的關係是一致的;
- Java 中任何類都是 java.lang.Object 的直接或間接子類;
- 子類不能繼承父類中訪問許可權為 private 的成員變數和方法;
- 子類可以重寫(override)父類的方法;
- 子類可以通過 super 關鍵字訪問父類的成員變數、方法和構造器;
- final 宣告的類或方法,不能被繼承或重寫;
6.3 多型
多型是在繼承的基礎上實現的,多型實現的三個必要條件:
- 繼承
- 方法重寫(override)
- 父類引用指向子類物件,例如:Human human = new Man(),這裡 Man extends Human。
當使用多型方式呼叫方法時,會依據以下規則:
- 首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;
- 若子類重寫了該方法,呼叫子類的重寫方法;
- 若子類沒有重寫該方法,則呼叫父類的方法;
多型的好處:可以使程式有良好的擴充套件,並可以對所有類的物件進行通用處理。
7. 總結
以上是本文的全部內容,希望能對你有所啟發。內容說不上全面、無誤,還望讀者朋友補充、指正。
最後,感謝閱讀。