1. 程式人生 > >“備孕期”的Java程式設計師一定要學會抽象

“備孕期”的Java程式設計師一定要學會抽象

我相信,看到標題後的你一定很好奇,究竟什麼樣的Java程式設計師算是在“備孕期”呢?在我看來,“備孕期”主要指那些初入Java程式設計的新人,他們正下足功夫準備,以求在10個月後以高薪的姿態進入一家軟體公司——此時正是職業履歷的開端——比如說,簡歷上的自我介紹是:我從2018年10月24日(程式設計師節)進入一家“青苗科技工作室”(我組織的一個接私活的小團隊;有Web全棧、安卓等方面的專案可以私聊我哦),正式開始編寫為自己帶來第一桶金的Java程式碼…距今,我已經有8年的Java程式設計經驗了…

一、什麼是OOP?

學習Java的程式設計師第一個要了解的基礎知識就是:什麼是OOP?讓我來舉一個生動的例子,知道齊天大聖孫悟空吧?這隻孫猴子就是一個物件,關鍵看你要把他看成是一隻猴子,還是一個神仙。你知道Dota嗎?在這款推塔殺人的遊戲當中,就有齊天大聖孫悟空這個角色,貌似歐洲戰隊玩的很溜,反倒國內戰隊在比賽中使用的頻率很低。

來看一段程式碼吧:

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

}

當我們把孫悟空看成一個物件的時候,程式設計就變得簡單了起來;我們給他兩個屬性(生命值和魔法值),給他兩個技能(棒擊大地和叢林之舞)。假如我是LGD戰隊的357,一名聰明絕頂的好教練,主要負責賽前的BP工作和戰術的研發。現在,是TI9的小組賽,LGD對陣OB的第一局。我,357在BP階段先BAN掉了比較剋制孫悟空的獸王和發條技師,然後在選人階段(PICK)挑選了水晶室女這個冰美人來和孫悟空這個一身毛的傢伙搭配。那麼,在我選孫悟空的這個階段,就等於說建立了一個孫悟空的物件,也就相當於Java中的new SunWukong()

。選好了孫悟空,讓誰來玩呢?自然是我們隊中號稱世界第一中單的maybe啊。

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

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

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

在我看來,OOP概念的提出,是程式設計界的一個重要的里程碑。它給我們以下重要的啟示:

  • 萬物皆物件。
  • 程式是物件相互協作的一個過程,他們通過傳送訊息來告知彼此要做的事情。
  • 每個物件都有自己的型別,也就是“每個物件都是某個類(class,抽象資料型別)的一個例項”。儘管每個物件都是唯一的(在記憶體中擁有一個唯一的地址),但具有相同狀態(屬性、變數)和類似行為(方法)的物件可以歸屬為一個類。
  • 每個物件都提供了某種服務。比如說孫悟空可以跳上樹上(叢林之舞),然後再跳下來對區域內的敵人造成減速和傷害(乾坤跳躍)。

二、什麼是繼承?

通俗來說,可以這麼來理解繼承(extends)——小明他爸是個七品芝麻官,那麼小明就是個管二代;小明他爸當年走過草地,越過大山,一下子步行了兩萬五千裡(換成現在的微信運動排名,絕對天天第一),那麼小明就是個巨集二代;小明他爸有三畝地,拆遷後分了10套房,那麼小明就是chai二代。

再繼續說下去:小華和小華他爸都是手藝人,都特別喜歡畫畫,小華他爸是自學成才,小華應該算是繼承了他爸的好基因,屬於天才型;等小華長到20歲的時候,他覺得不能就這麼一直和他爸一樣只畫風景畫,那樣他取得的成就也不會高過他爸;於是,他改畫人像畫,經過十年的努力,小華在藝術界的地位甚至超過了他爸,人稱“華·芬奇”。按程式設計師的邏輯思維來看,小華這個舉動可以稱作為“覆蓋(overriding)”,使子類和父類產生差異的一種方法。

小華畫呀畫呀,就這麼一直畫到了40歲;小華終於感到畫畫再也滿足不了他了,他突然愛上Java程式設計,並立志成為一名“黑客”;於是就有了“黑客與畫家”的故事。按程式設計師的邏輯思維來看,小華成為“黑客”這個行為可謂特立獨行,這使得小華和他爸不再只是純粹的替代關係(is-a的關係),變成了一種相似的替代關係(他們都還是畫家,但小華同時又是一名黑客,is-like-a的關係)。

在Java中,所有的類最終的父類都是Object類,這被稱為“單根繼承”——保證了多有物件都具備了某些功能。比如說最常見的toString()方法:

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

三、one more thing?

nothing。

沒有了,我認為一篇文章的最佳字數在2000到3000,這篇文章寫到這裡已經2600多字了。所以,是時候收尾了:Java是一門面向物件的程式語言,因此,“備孕期”的Java程式設計師一定要學會“抽象”,把現實問題抽象為一個個立體化的物件,這樣所有的問題就會按照人的邏輯來處理,而不是計算機的邏輯。