什么是面向對象編程(OOP)?


Java 程序員第一個要了解的基礎概念就是:什么是面向對象編程(OOP)

玩過 DOTA2 (一款推塔殺人的游戲)嗎?里面有個齊天大聖的角色,歐洲戰隊玩的很溜,國內戰隊卻不怎么會玩,自家人不會玩自家的神話英雄,實在有點悲哀。

我們用 Java 定義一個孫悟空的類吧:

public class SunWukong {
	private Integer healthPoint;// 生命值
	private Integer magicPoint;// 魔法值
	
	/**
	 * 棒擊大地
	 */
	private void rodHittingTheEarth() {
		
	}
	
	/**
	 * 叢林之舞
	 */
	private void jungleDance() {
		
	}

}

我們給他兩個屬性(生命值 healthPoint 和魔法值 magicPoint),給他兩個技能(棒擊大地 rodHittingTheEarth() 和叢林之舞 jungleDance())。

假如我是 LGD(老干爹,國內知名 DOTA 戰隊)的教練 357(已辭職),一名聰明絕頂的好教練(真的禿頭了),主要負責賽前的 BP(Ban 和 Pick,拌掉對方的英雄和選己方英雄) 工作。

現在,是 TI9 的小組賽(已結束),LGD 對陣 OB(歐洲戰隊,兩屆冠軍) 的第一局。

我——357 在 BP 階段先 BAN 掉了比較克制孫悟空的獸王和發條技師,然后在選人階段(PICK)挑選了水晶室女這個冰美人來和孫悟空這個一身毛的家伙搭配。

那么,在我選孫悟空的這個階段,就等於說創建了一個孫悟空的對象,也就相當於 Java 中的 new SunWukong()。選好了孫悟空,讓誰來玩呢?自然是隊中號稱世界第一中單的 maybe。

面向對象編程(OOP)其實並不難懂,不就是英文單詞 Object-Oriented Programming 的首字母縮寫嘛。OOP 給我們一種概念,就是“萬物皆對象”——我們可以盡可能的發揮想象,把現實中的物(包括動物、人物、甚至無生命的事物)抽象為一種計算機語言(比如 Java)能懂的模型,那么接下來,計算機解決現實中的問題就變得簡單了起來。

OOP 的強大之處就在於,它使我們不必依照計算機的限制來模擬現實中的物;我們可以基於現實中要解決的問題來構建對象,使這個對象具有現實中物所具有的特征(對應 Java 類中的屬性)和行為(對應 Java 類中的方法)。物不同,對象所具有的屬性和方法就會不同。

還拿 DOTA 中的英雄來說吧。

所有的英雄都可以抽象為一個類(對象是類的實例化),這個類包含了英雄對應的成長屬性(生命值、魔法值、傷害值、護甲值等等),以及對應的技能行為。那么,怎么區分每個英雄的不同呢?比如說冰美人水晶室女是一個魔法輔助類的英雄,因此,她的初始化生命值自然比敏捷類的齊天大聖低一些,但魔法值高一些;另外,他們的技能也完全不同——孫悟空拿着一根金箍棒,所以他的技能就有棒擊大地;水晶室女拿着一根法杖,所以她的技能就有冰霜新星、冰封禁制等。

面向對象編程給我們了一些重要的啟示:

1)萬物皆對象。

2)程序是對象相互協作的一個過程,他們通過發送消息來告知彼此要做的事情。

3)每個對象都有自己的類型,也就是“每個對象都是某個類(抽象數據類型)的一個實例”。盡管每個對象都是唯一的(在內存中擁有一個唯一的地址),但具有相同狀態(屬性、變量)和類似行為(方法)的對象可以歸屬為一個類。

4)每個對象都提供了某種服務。比如說孫悟空可以跳上樹上(叢林之舞),然后再跳下來對區域內的敵人造成減速和傷害(乾坤跳躍)。

面向對象編程的代碼易維護、易復用、易擴展,因為面向對象有三大特性:封裝、繼承、多態。

1)封裝,每個對象的模板——類可以自由地定義屬性和行為,使其有別於別的類。

2)繼承,子類可以輕松地復用父類的代碼(屬性和行為),只需要一個關鍵字——extends。如果父類的屬性不滿足子類的需求,可以追加;如果父類的方法不滿足子類的需求,可以覆蓋。

3)多態,這個特性是基於前面兩個特性衍生出來的,比較難掌握一些。可以先嘗試理解一下。現在有兩個對象,一個是子類的對象,一個是父類的對象,假如把它們傳遞給同一個方法的時候,該方法的參數可以定義為父類的類型(假如定義為子類類型的時候,父類就無法傳遞),方法在執行的時候會自動識別傳遞的是父類還是子類。

封裝、繼承、多態這三個特性對於初學者來說,有點頭大。不過不用擔心,我會在后面的文章中繼續深入地介紹。

上一篇:Java:程序不過是幾行代碼的集合

下一篇:如何理解 Java 中的繼承?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM