JAVA第二次blog總結

JAVA第二次blog總結

0.前言  

  這是我們在部落格園上第二次寫部落格,進行JAVA階段學習的總結。現在我們接觸到JAVA已經有一段時間了,但難點還是在於編程思想和方法的改變,第二階段的學習讓我對於理解面向對象的封裝性、繼承性與多態性三大技術特性有了很大的進步。在這篇blog中將針對面向對象的封裝性、繼承性與多態性三大技術特性新的認識進行總結。

 1.作業過程總結

  針對上次總結中提到的以c語言的方式去寫JAVA的這個問題,在這階段的學習里有了很大的改變,在寫PTA作業時已經能夠看到對象,方法,屬性,類的痕迹了,腦子裡的概念也基本完善,對於程式的可讀性也有了不錯的改善。而且對於類的學習和認識也讓我程式的復用性大大提高。

 

  這三次的作業分別涉及到了正則表達式的應用,StringBuilder的應用,多態,繼承,介面,抽象類,重載的應用,這些部分也是我們此階段學習的重點,PTA則考查的是學習掌握情況和實際應用能力。第一次作業7-1 水文數據校驗及處理難度非常大,也是我們第一次應用正則表達式,使用Java中的字元串處理類以及正則表達式對輸入字元串數據進行合法性校驗及計算。在聽完老師上課講的正則表達式之後我還是迷迷糊糊的根本弄不清楚,下課後參考CSDN里的帖子和錄像回放才算是勉強明白,但是到了實際應用總是出問題,特別是輸入輸出的格式。除此之外小時分鐘秒、流量、水位也都要用正則表達式判斷。這道題在時間截止前還是沒有得到分數,但是在之後老師上課對這道題的講解讓我有了很大收穫。之後蒙特卡羅方法求出圓周率里產生隨機數記憶體超限以及圖形繼承里的繼承介面問題都給我造成了不小的困擾,但是也都一一解決了。第二次作業主要考察類的繼承和多態性的使用方法。是在上一次作業的基礎上進行功能和類的改進,不僅有抽象方法還有對圖形屬性的合法性檢驗。最後的排序也一度讓我頭疼不已但是後來發現這就是一個死的套路,學會之後使用起來很是方便。第三次作業依然是對圖形繼承的改進,這次採用了新的card類並進行排序,而且要求對卡片排序採用Comparable介面,但其實和我第一次所用的排序方法不謀而同。只是這次對於圖形合法性判斷以及輸出格式有了很大的難度提升。最後一題對於求素數的演算法優化讓我感到很有趣,這不僅是編程演算法應用的考察也是數學方面對於素數新的認識,同時也讓我學習到了時間複雜度這個新的概念!在CSDN上看了很多篇帖子,也看到了各種各樣的方法和思路,其中最好的兩個就是埃拉托色尼篩選演算法和歐拉篩選法。雖然歐拉篩選法時間複雜度更低,但是我對於歐拉演算法空間換時間和下劃數的思想不是很理解,所以採用了埃式演算法。

 

  這幾次作業在編寫程式上花費的時間不是特別多,主要是學習思想和方法比較占時間,但是如果你體會到了技術特性的特點,那你將會完成的很快,因為只有第一次是需要完全自己去寫的,後面幾次作業都是在前面的框架基礎上進行結構和功能的改進,這讓作業做起來越來越快。想要通過作業逐步理解面向對象的封裝性、繼承性與多態性三大技術特性就要體會各個題目要求之間的相同與不同,在此基礎上對框架進行修改,不能因為麻煩或者不理解就推倒重做,雖然那樣也能完成要求,但是這樣就失去了體會三大特點的機會,修改的過程才是你感悟和理解的過程。

 

  至於編程的嚴謹性已是老生常談了,這一點在水文檢測的正則表達式和圖形繼承排序是輸出里體現的淋漓盡致,在排序里明明我寫的是對的,但是從大到小排讓我弄成了從小到大排,導致測試點過不去浪費了很多時間,這都是粗心和不嚴謹造成的,不能一味地想當然。

 

2.OOP設計心得

  面向對象程式設計有封裝性、繼承性與多態性三大技術特性封裝性就是講程式的各個部分封裝成類,然後按功能和職責對某些屬性或方法設置訪問許可權。繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。多態就是對象在不同情況下的不同表現,具體體現在定義和功能兩個方面,簡單的總結一下,多態可以用「三個定義和兩個方法」來總結。三個定義分別是父類定義子類構建、介面定義實現類構建和抽象類定義實體類構建,而兩個方法分別是方法重載和方法重寫。這三個技術特性的關係密切,封裝可以使程式碼模組化,繼承可以實現父類子類之間模組的聯繫再賦予多態用於介面,使介面重用。這樣相互配合就可以提高程式碼的邏輯性和復用性。總結起來就是一句話OOP=對象++繼承+多態+消息,其中核心概念是類和對象。

 

  面向對象設計有兩個基本原則單一職責原則和開閉原則。單一職責原則規定一個類應該只有一個發生變化的原因,不要存在多於一個導致類變更的原因。通俗地說,即一個類只負責一項職責。而開閉原則講的是一個軟體實體如類、模組和函數應該對擴展開放,對修改關閉。也就是說,如果修改或者添加一個功能,應該是通過擴展原來的程式碼,而不是通過修改原來的程式碼。OPP的思維方法首先考慮的不是解決問題,而是將所有東西想像成一個框架,再利用框架去思考問題,最後解決問題。

 

  類的設計要根據題目的需求和邏輯的判斷,就像上文提到利用框架去解決問題一樣,這個「類」就可以成為你解決問題的框架。「類」顧名思義起到了分類的作用,讓你的程式更有邏輯性和可讀性,同時也提升了復用性。再結合封裝性、繼承性與多態性三大技術特性也就完成了OOP。平時寫PTA的時候就會根據指導書里所給的類圖去編寫程式,發現非常便捷,同時也學習和觀察,慢慢體會類圖的設計思想。

 

3.測試的理解與實踐

  對於PTA里的測試點,我覺得測試用例應該主要從邊界值,特殊值,錯誤輸入值這三方面來檢驗。同時也要注意記憶體超限和死循環的情況。Junit進行程式的測試是非常重要的,我們寫程式碼無非分三樣:主流程、介面、實現類。Junit就可以保證程式碼的準確性,它就是我們平時所說的白盒測試,它需要程式設計師知道被測試的程式碼如何完成功能,以及完成什麼樣的功能。平時我們想要測試程式碼的正確性,那麼必須新建一個類,然後創建一個 main() 方法,然後編寫測試程式碼。但是如果需要被測試的程式碼太多就會很繁瑣,而Junit能很好的解決這個問題,對每一部分進行分別測試,讓我們在編寫程式碼的過程中就可以直接測試,在編寫以後的程式碼中如果發現問題可以較快的追蹤到問題的原因,同時也便於解決問題。

 

 4.課程收穫

之前上面談了很多,在這裡簡要總結一下

明白OOPOPP的區別

在學習和編寫JAVA的時候要用OOP的思維去解決問題

利用框架和「類」的思想去思考問題解決問題

注意嚴謹性,避免粗心而導致邏輯上的錯誤

利用Junit單元測試(白盒測試)去提高我們編寫程式的效率並避免錯誤

理解了面向對象程式設計封裝性、繼承性與多態性三大技術特性

 

 5.對課程的建議

  經過這兩個階段的學習,我們對OOP也有所理解和感悟。但是對於封裝性、繼承性與多態性的理解還是很抽象,依舊是迷迷糊糊的。希望老師在上課的時候可以繼續講解。老師舉例講課的方法很形象,但是我們需要時間慢慢去體會,對於我這種理解能力不強的,可能會跟不上老師的節奏,而且有的時候因為網路延遲問題聽不清老師講課,所以下課要不斷看回放,希望老師能在下課後快一點將回放放出來便於我們再次去學習和理解。同時我注意到實驗是沒有回放的,希望老師加上。

  對於作業題量我沒什麼建議,畢竟學習就是需要不斷去練習,不斷的練習。但是第一次運用新知識總是比較困難的,所以希望新內容考察的題目可以降低一點難度,平時總是有些難以下手不知所措的感覺。PTA題目的指導書很棒,每當我思路空白的時候它總是能給我很多幫助,希望可以詳細一點同時對一些 定義內容進行解釋,畢竟我們現在沒有課本,這會對我們幫助很大的。