Java 程式員第一個要瞭解的基礎概念就是: "什麼是面向對象編程(OOP)" ? 玩過 DOTA2 (一款推塔殺人的游戲)嗎?裡面有個齊天大聖的角色,歐洲戰隊玩的很溜,國內戰隊卻不怎麼會玩,自家人不會玩自家的神話英雄,實在有點悲哀。 我們用 Java 定義一個孫悟空的類吧: 我們給他兩個屬性(生命 ...
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 中的繼承?