看球學習兩不誤 看世界盃 學面向對象

需求分析

老闆:“小碼啊!現在世界盃很火啊,給我的首頁加一個小組積分榜,明天早上能看到就行了”

我:“老闆,這個有點麻煩啊,晚上不是要熬夜加班?”

老闆:“你看看你,球迷們熬夜看球不辛苦嗎?啊?他們有抱怨嗎?啊?我報銷宵夜還不夠嗎?啊啊啊?小碼啊,覺悟還要提高啊~”

我:“......”

苦逼的程序員已經習慣了,我們還是老老實實看需求吧。

看球學習兩不誤 看世界盃 學面向對象

積分榜

我們前面有說過,一個軟件的開發週期中,有一個很重要的環節,叫做需求制定,這個時候會有設計文檔和產品原型,作為一個程序員,我們必須學會看這兩種文檔,然後根據文檔將製作頁面和數據。我們用上圖作為原型設計來講解一下(原型設計就是一個功能完成後會是什麼樣子)。

看球學習兩不誤 看世界盃 學面向對象

原型分析

我們首先要做的,就是把頁面功能裡面的動態數據和靜態數據分離出來,這樣就可以明確前後端開發的分工,哪部分是前端開發,哪些是後端開發。上圖綠色部分,就是後端需要提供的數據。下面對這個原型進行一個分解,大家看起來會更明白一點。

看球學習兩不誤 看世界盃 學面向對象

原型分析

這樣看不知道大家理解了沒有,其實頁面就像一個模板,我們不管有幾個分組,使用同一個模板進行佈局即可,然後再通過後端提供的數據,往前端製作好的模板裡面填充數據即可。過程跟下面這個很像。

看球學習兩不誤 看世界盃 學面向對象

人形立牌

現在應該懂了吧,我們為什麼要前後分離開。我們已經將一個需求分解到任務了,就是我們已經知道我們要做什麼了,我們需要返回一個小組中各個球隊的數據情況。我們都知道,java項目是由一個個類組成的,我們的類是java的一等公民,那我們如何設計一個類,來告訴前端這些數據呢?我們接著往下看。

類的結構

類是對一類事物的抽象,也就是說我們的球隊是對每個具體球隊的抽象。比如說,球隊是抽象的,烏拉圭,俄羅斯,沙特阿拉伯,埃及這些球隊是具體的,那麼我們就將球隊抽象出來做成一個類就行了。類的結構可以很複雜,但是基本上都會有3個部分組成,成員變量,構造器,方法。

成員變量就是這個類有哪些屬性,比如我們的球隊有名稱,場次,勝平負等數據,這些就是描述球隊的屬性,成員變量一般就是描述類的屬性,比如人這個類,他的屬性有身高,體重,性別等等,這些都可以作為人這個類的成員變量。

構造器,專門用來創建對象的方法,通過類來創建對象會使用 new 這個關鍵字,使用new來創建對象就會調用構造器,然後得到的就是類的實例,也就是對象。比如根據球隊類,創建出來的對象就可以是烏拉圭隊,俄羅斯隊等等,這兩個隊只是改了一下名字這個屬性。

方法,用於描述類的行為,可以將成員變量理解成名詞,方法理解為動詞,成員變量定義了屬性,方法定義了動作。比如我們球隊的積分和淨勝球是可以計算出來的,根據勝負平場次計算積分,根據進球和失球計算淨勝球。所以我們可以將計算積分和淨勝球定義成方法。

用於描述語法和類結構,因此下面這個類的寫法極其不規範,暫時這樣先用著,後面會做專門說明。

看球學習兩不誤 看世界盃 學面向對象

類的結構

上圖中我們從上往下看,首先是類的定義,這裡要注意一下,類的首寫字母一定要是大寫的 Team。再往下,成員變量的首寫字母是小寫,如果只有一個單詞,直接小寫單詞即可比如 name,如果多個單詞組成,第二個單詞開始,首寫字母大寫,goalDifference,這就是駝峰結構。這裡我們還需要注意的一點就是命名方式,命名有個最大的重點就是要一看就懂,不要追求英文單詞的準確性和語法,我們是寫代碼,不是學英語。比如我們這裡寫了個進球的變量叫 goal,百度了一下,失球叫 fumble ,但是對於普通人來說,這個詞看上去就懵了,所以這樣寫沒錯,但是不建議,像我這樣寫就行了,失球 loseGoal ,一目瞭然。雖然單詞和語法層面來說是錯的,但是理解方便即可。

再看方法,方法的名稱也是一樣用駝峰法,calculateGoalDifference ,三個單詞從第二個開始首寫字母大寫。方法是用來定義類的行為的,就是說他是個動作,所以我們最好使用動詞來定義它。比如我這裡就用 calculate 計算 來修飾 GoalDifference 淨勝球,這樣讀到這個名字就知道這是一個方法。

最後看構造器,好吧,你是看不到的....因為如果你不自己寫構造器,每個類會定義一個默認的隱身的構造器,只是你不知道你用過他而已。

對象的創建

其實上面這個圖裡面最重要的不是成員變量,不是方法,而是

Team team = new Team();

這一句話,這句話博大精深,裡面包含了類,對象,構造器。

看球學習兩不誤 看世界盃 學面向對象

創建對象

前面講數組的時候我們就說過new這個關鍵字,這裡的new在內存裡面乾的活和創建數組的時候是一樣的,team變量在棧,對象在堆,team的值是個地址,指向堆裡面的對象。我們千辛萬苦終於創建好了對象,那麼他用來幹嘛的?

1.調用成員變量。2.調用方法

看球學習兩不誤 看世界盃 學面向對象

調用

上圖就是調用成員變量和調用方法。

我們觀察上面的代碼,會發現一個問題,我們創建了對象以後,需要一個個的調用成員變量,設置值,這樣感覺好累,為什麼要這樣做?這跟我們那個隱身的默認構造器有關了。我們知道一個類是必須有一個構造器的,如果自己不寫構造器,那麼就是使用這個什麼也不幹的構造器,既然這個默認構造器啥也沒幹,我們創建出來的對象,就是個 空對象,就是說我們的對象裡面的屬性全是沒有賦值的,如果我們手寫構造器,在創建對象的時候,就把對應屬性的值傳去的話,這樣創建出來的對象,屬性就是有值的。

看球學習兩不誤 看世界盃 學面向對象

畫複雜了

這張圖不小心畫複雜了點,主要是裡面知識點比較多,我們按照順序一個個來看。

我們在學習的時候,要明確一點,程序的入口在main方法,程序執行從main方法開始,所以我們先看 1,這裡其實就是一句話,new了一個對象,然後使用了自己寫的構造器,沒有用那個會隱身的構造器。我們的構造器可以同時存在多個,但是他們的參數是不能相同的,比如我們創建了一個構造器,他有7個參數,然後手寫了一遍默認構造器,沒有參數,這樣是可以的。只要我們寫了自己的構造器,必須手寫一遍默認構造器。

2 參數必須一一對應好,構造器裡面參數第一個是名稱,第二個是場次數量等等,我們在new對象的時候,傳進去的參數必須也是按照這個順序,不能出錯。

3 參數賦值,成員變量屬於對象,當我們使用構造器創建對象的時候,成員變量會被 “打包” 跟著這個創建出來的對象,所以我們需要在創建對象的時候,就給屬性賦值的話,就靠這一步了,我把創建對象的時候輸入的參數,傳入了成員變量,這樣,當這個對象創建出來的時候,他的屬性就有值了。然後就是當參數與成員變量重名的時候,需要使用 this 這個關鍵字,this.name = name,表示我是將參數裡name的值傳遞給了成員變量裡面的name,這樣程序才能正確的執行。

4 除了默認構造器會隱身,其實我們的 this 關鍵字也會隱身,在我們的構造器中調用本類的方法的時候,可以省略前面的this。在我們的方法裡面如果成員變量和參數沒有重名,也可以省略成員變量前面的this。

最後看打印結果,我們只寫了一行創建對象的代碼,創建出來的對象裡的屬性都是有值的,並且都跟我們計算好結果了。這就是自己手寫構造器的好處。


分享到:


相關文章: