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

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:程序不過是幾行代碼的集合

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

相關文章
相關標籤/搜索