Java 程序員第一個要了解的基礎概念就是:什麼是面向對象編程(OOP)?html
玩過 DOTA2 (一款推塔殺人的遊戲)嗎?裏面有個齊天大聖的角色,歐洲戰隊玩的很溜,國內戰隊卻不怎麼會玩,自家人不會玩自家的神話英雄,實在有點悲哀。java
咱們用 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,拌掉對方的英雄和選己方英雄) 工做。oop
如今,是 TI9 的小組賽(已結束),LGD 對陣 OB(歐洲戰隊,兩屆冠軍) 的第一局。code
我——357 在 BP 階段先 BAN 掉了比較剋制孫悟空的獸王和發條技師,而後在選人階段(PICK)挑選了水晶室女這個冰美人來和孫悟空這個一身毛的傢伙搭配。htm
那麼,在我選孫悟空的這個階段,就等於說建立了一個孫悟空的對象,也就至關於 Java 中的 new SunWukong()
。選好了孫悟空,讓誰來玩呢?天然是隊中號稱世界第一中單的 maybe。對象
面向對象編程(OOP)其實並不難懂,不就是英文單詞 Object-Oriented Programming
的首字母縮寫嘛。OOP 給咱們一種概念,就是「萬物皆對象」——咱們能夠儘量的發揮想象,把現實中的物(包括動物、人物、甚至無生命的事物)抽象爲一種計算機語言(好比 Java)能懂的模型,那麼接下來,計算機解決現實中的問題就變得簡單了起來。繼承
OOP 的強大之處就在於,它使咱們沒必要依照計算機的限制來模擬現實中的物;咱們能夠基於現實中要解決的問題來構建對象,使這個對象具備現實中物所具備的特徵(對應 Java 類中的屬性)和行爲(對應 Java 類中的方法)。物不一樣,對象所具備的屬性和方法就會不一樣。遊戲
還拿 DOTA 中的英雄來講吧。
全部的英雄均可以抽象爲一個類(對象是類的實例化),這個類包含了英雄對應的成長屬性(生命值、魔法值、傷害值、護甲值等等),以及對應的技能行爲。那麼,怎麼區分每一個英雄的不一樣呢?好比說冰美人水晶室女是一個魔法輔助類的英雄,所以,她的初始化生命值天然比敏捷類的齊天大聖低一些,但魔法值高一些;另外,他們的技能也徹底不一樣——孫悟空拿着一根金箍棒,因此他的技能就有棒擊大地;水晶室女拿着一根法杖,因此她的技能就有冰霜新星、冰封禁制等。
面向對象編程給咱們了一些重要的啓示:
1)萬物皆對象。
2)程序是對象相互協做的一個過程,他們經過發送消息來告知彼此要作的事情。
3)每一個對象都有本身的類型,也就是「每一個對象都是某個類(抽象數據類型)的一個實例」。儘管每一個對象都是惟一的(在內存中擁有一個惟一的地址),但具備相同狀態(屬性、變量)和相似行爲(方法)的對象能夠歸屬爲一個類。
4)每一個對象都提供了某種服務。好比說孫悟空能夠跳上樹上(叢林之舞),而後再跳下來對區域內的敵人形成減速和傷害(乾坤跳躍)。
面向對象編程的代碼易維護、易複用、易擴展,由於面向對象有三大特性:封裝、繼承、多態。
1)封裝,每一個對象的模板——類能夠自由地定義屬性和行爲,使其有別於別的類。
2)繼承,子類能夠輕鬆地複用父類的代碼(屬性和行爲),只須要一個關鍵字——extends
。若是父類的屬性不知足子類的需求,能夠追加;若是父類的方法不知足子類的需求,能夠覆蓋。
3)多態,這個特性是基於前面兩個特性衍生出來的,比較難掌握一些。能夠先嚐試理解一下。如今有兩個對象,一個是子類的對象,一個是父類的對象,假如把它們傳遞給同一個方法的時候,該方法的參數能夠定義爲父類的類型(假如定義爲子類類型的時候,父類就沒法傳遞),方法在執行的時候會自動識別傳遞的是父類仍是子類。
封裝、繼承、多態這三個特性對於初學者來講,有點頭大。不過不用擔憂,我會在後面的文章中繼續深刻地介紹。
下一篇:如何理解 Java 中的繼承?