20155303 2016-2017-2 《Java程序设计》第四周学习总结
20155303 2016-2017-2 《Java程序設計》第四周學習總結
教材學習內容總結
第六章 繼承與多態
6.1 何謂繼承
繼承避免多個類間重復定義共同行為,使用關鍵字extends。繼承表明了子類與父類之間的is-a關系,中文稱為“是一種”。子類繼承父類之后,定義與父類中相同的方法部署,但執行內容不同,這稱為“重新定義” ,即“重寫”(Override)。
多態是使用單一接口操作多種類型的對象。
@Override是一個內建的標準標注。如果在子類中某個方法前標注@Override,表示要求編譯程序檢查,該方法是不是真的重新定義了父類中的某個方法,如果不是的話,就會引發編譯錯誤。
如果某方法區塊中沒有任何程序代碼操作,可以使用abstract標示該方法為抽象方法。該方法不用撰寫{}區塊,直接;結束即可。如果嘗試用抽象類創建實例,就會引發編譯錯誤。
6.2 繼承語法細節
被聲明為protect的成員,相同包中的類可以直接存取,不同包中的類可以在繼承后的子類直接存取。
依權限大小可分為private、無關鍵字、protected與public。
在Java中,如果想取得父類中的方法定義,可以在調用方法前,加上super關鍵字。可以使用super調用的父類方法,不能定義為private(因為這就限定只能在類內使用)。
重新定義方法要注意,對于父類方法中的方法權限,只能擴大不能縮小。若原來成員public,子類重新定義時不可為private或protected。
如果想執行父類中某構造函數,可以使用super()指定。如:super(10)表示調用父類構造函數時傳入int數值10。
如果class前使用了final關鍵字定義,那么表示這個類是最后一個了,不會再有子類,也不會被繼承。
在Java中,任何類追溯至最上層父類,一定是java.lang.Object。
在go()方法中,可以調用抽象方法。
第七章 接口與多態
7.1 何謂接口
在Java中可以使用interface關鍵字定義行為。
類要操作接口,必須使用implement關鍵字。操作某接口時,對接口中定義的方法有兩種處理方式:一是操作接口中定義的方法,二是再度將該方法標示為abstract。
繼承有“是一種”的關系,操作接口則表示“擁有行為”。
在Java中,類可以同時繼承某個類,并操作某些接口。
在Java中,接口可以繼承自另一個接口,也就是繼承父接口行為,再在子接口中額外定義行為。
7.2 借口語法細節
在Java中可以使用interface定義抽象的行為和外觀。接口中的方法沒有操作時,一定得是公開且抽象。
在接口中枚舉常數,一定要使用“=”指定值,否則會編譯錯誤。
在撰寫Java程序時,經常會有臨時繼承某個類或操作某個接口并建立實例的需求。由于這類自類或接口操作類只使用一次,不需要為這些類定義名稱,因此可使用匿名內部類來解決這個需求。
enum可用于定義枚舉常數。
教材學習中的問題和解決過程
『問題一』: Java字符串格式化String.format()的使用問題
課本P172出現了String.format()作為返回值,但關于format()方法的用法課本上并沒有解釋。
『解決』:在一篇JAVA字符串格式化String.format()的使用方法的博客中學習到,String類的format()方法用于創建格式化的字符串以及連接多個字符串對象。不同轉換符可以實現不同數據類型到字符串的轉換。
- 『問題二』:對Java“高內聚,低耦合”的理解
這周去找學長請教問題的時候,聽到他說“最好不要在一個class里新建另一個class,在一個方法里調用另一個方法”。問他原因,他說,這違背了面向對象“高內聚,低耦合”的原則。那么,具體體現在哪些方面呢?
『解決』:之前老師在預備作業中讓我們思考過這個問題,現在學習了一段時間Java,對這個原則有了更深刻的理解。對于低耦合,我的理解是:一個完整的系統,模塊與模塊之間,盡可能的使其獨立存在。也就是說,讓每個模塊,盡可能的獨立完成某個特定的子功能。模塊與模塊之間的接口,盡量的少而簡單。如果某兩個模塊間的關系比較復雜的話,最好首先考慮進一步的模塊劃分。這樣有利于修改和組合。高內聚則指在一個模塊內,讓每個元素之間都盡可能的緊密相連。也就是充分利用每一個元素的功能,各施所能,以最終實現某個功能。如果某個元素與該模塊的關系比較疏松的話,可能該模塊的結構還不夠完善,或者是該元素是多余的。
在一篇Java高內聚、低耦合的理解的博客中,對這個原則進行了通俗易懂的解釋。做到“高內聚,低耦合”,模塊的“可重用性”、“移植性”也就大大增強了。
- 『問題三』:靜態分配與動態分配
『解決』:所有依賴靜態類型來定位方法執行版本的分派動作稱為靜態分配,靜態分配發生在編譯階段,其典型動作是方法重載(Overload)。在運行期根據實際類型確定方法執行版本的分配過程稱為 動態分配,它和多態性的另外一個重要體現——方法重寫(Override)有著密切的關系。
- 『問題四』:abstract class與interface(即 抽象類 與 接口)
『解決』:abstract class和interface是Java語言中對于抽象類定義進行支持的兩種機制。不過,抽象類提供了繼承的概念,它的出發點就是為了繼承,否則它沒有存在的任何意義。所以說定義的抽象類一定是用來繼承的。接口是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該接口的實現類必須要實現該接口的所有方法,通過使用implements關鍵字,表示該類在遵循某個或某組特定的接口。
抽象類與接口有各自不同的使用方法,關于使用這兩者時的注意事項,在博客java提高篇(四)——抽象類與接口有具體詳盡的解釋。
- 『問題五』:方法重載 與 方法重寫
『解決』:多態性是面向對象編程的一種特性,和方法無關。靜態多態性是指,同樣的一個方法能夠根據輸入數據的不同,做出不同的處理,即方法的重載(有不同的參數列表)。動態多態性是指,當子類繼承父類的相同方法,輸入數據一樣,但要有別于父類的相應時,就要覆蓋父類方法,即在子類中重寫該方法(相同參數,不同實現)。
- 『問題六』:super. 與 this.
『解決』:this表示當前對象,也就是當前類對象,super表示當前類的父類。例如:定義一個新的類A,這個A繼承了類B,也就是說B是A的父類。那么如果A中有個方法:aa();B中也有個方法: aa();
那么在A 中用this.aa()調用的就是A中定義的方法,而super.aa()調用的就是A的父類B中定義的方法aa()。詳細講解參考博客super,this的區別和使用。
super.如下:
this.如下:
- 『問題七』:add()方法的使用
課本P179提到,“如果要收集對象,可通過add()方法”。
『解決』:之前學習過java.math.BigDecimal標準類中的add()方法,java.util.ArrayList中也有add()的方法,查詢API文檔比較如下:
java.util.ArrayList.add()
java.math.BigDecimal.add():
代碼調試中的問題和解決過程
- 『問題一』: 標準備注@Override的使用
『解決』:在子類某個方法前標注@Override之后,會出現左側的提示,查看該方法重新定義的父類方法。
- 『問題二』:操作接口時缺少具體行為
如果類操作另一個類,沒有定義行為時,程序會報錯:
『解決』:操作類時,要注意定義行為。
- 『問題三』:length、length() 與 size()的區別
課本P179的程序和P180的程序分別用到了length 與 size(),但不太清楚這兩者的用法。
『解決』:參考博客java中length,length(),size()區別進行學習,了解到java語言中針對數組提供了length屬性來獲取數組的長度,針對字符串提供了length()方法來獲取字符串的長度,針對泛型集合類提供了size()方法來獲取元素的個數。所以三者的用法還是有區別的。編寫了一個程序加深對這三者的理解:
- 『問題四』:一個很大的數與一個很小的數運算時,會發生消去誤差。例如計算1+1/2+1/3+...+1/n時,從右向左計算會比從左向右計算得到更精確的結果。編寫程序嘗試了一下,卻出現了以下的結果:
『解決』:沒有考慮到類型轉換問題,將sum += 1/i;改為sum += (float) 1/i后問題得到解決。
代碼托管
- 代碼提交過程及代碼量截圖:
上周考試錯題總結
- Linux Bash中,(grep)命令可以進行全文搜索。
『考點』:grep是linux中很常用的一個命令,主要功能就是進行字符串數據的對比,能使用正則表達式搜索文本,并將符合用戶需求的字符串打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。grep在數據中查找出一個字符串時,是以整行為單位來進行數據選取的。
格式及常用的參數如下:
- System.out.println(“”+52+25);的結果是(5225)
『考點』:System out println(""+i);等價于System.out.println(i.toString());。public String toString()返回該對象的字符串表示。通常,ToString()方法會返回一個“以文本方式表示”此對象的字符串。因此在本題中以字符串形式輸出5225。
- p86 Guess.java中guess的值無法輸入12。(X)
『考點』:代碼:guess = scanner.nextInt();表示獲取輸入的下一個整型數,而且程序中沒有設置錯誤輸入提醒,所以可以輸入12.
- 可以使用java.util.Arrays的(fill())方法把數組初始化成相同的值。
『考點』:查詢API文檔可知,fill()方法的作用是Assigns the specified int value to each element of the specified array of ints.,即:將指定的int值賦給數組的每個元素。
- “30”轉化為byte類型的30的語句是(Byte.parseByte(“30”);)
『考點』:同樣查詢API文檔可知,java.lang.Byte.parseByte()方法的作用是Parses the string argument as a signed decimal byte.,即:將字符串參數轉換為帶符號的十進制數。
錯題總結
考點均在所學范圍內,但考察得非常細致,這就要求我們在學習過程中一定要認真對待敲過的每一行代碼,弄懂學習過程中的每一個疑問。同時,API對Java的學習非常有幫助,對于不太理解的方法,我們都可以從API中獲得滿意的解釋。綜上,在今后的學習過程中要勤于動手,善于思考。
學習感悟
『關于學習過程與方法』學習Java課程第四周,我最大的感悟是:不能局限于把課本上的代碼敲上去,而不進行任何思考,不然再次拿起課本還是一頭霧水。另外,CSDN真的是一個超級厲害的網站!學習過程中遇到的問題基本上都能在CSDN上各位牛人的博客中找到答案。所以,學編程,經常逛逛其他人的經驗分享,總會有很大收獲。
『關于英語學習』本以為過了四六級,英語水平就能應付日常了,但是Java的學習讓我意識到這還遠遠不夠。很多時候在維基百科搜到的文章都是英文的,圖書館也有很多關于編程的書籍只有英文版。看到這些,我只能咬咬牙,一邊借助百度翻譯,一邊一個單詞一個單詞地啃,費時費力不說,理解還不一定準確透徹。So,本來每天在扇貝新聞閱讀BBC報導的我,決定重新拾起扇貝單詞,努力達到老師口中的“無障礙閱讀英文著作”。
『關于Further Learning』新的一周總能認識到自己新的不足,遇到問題上網查閱資料的時候,這種體會尤為真切。網上的技術牛人太多太多,每次都是懷著近乎虔誠的心情點開博客,聽過來人娓娓道來,細致講解,深深明白自己的水平還與他們存在很大差距。所以,大學四年的結束不應該是我們學習的終結,而應該是一個新的開始。學無止境,希望所有人都能堅持“Lifelong-Learning”,在更深更遠更廣的領域開創出自己的一片天地。
學習進度條
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 16/16 | 1/1 | 18/18 | 初步認識了Java |
| 第二周 | 219/235 | 1/2 | 28/46 | 學習了Java的基本語法知識 |
| 第三周 | 766/1001 | 1/3 | 23/69 | 了解對象與參考的關系,以及封裝的概念與實現 |
| 第四周 | 984/1985 | 1/4 | 18/87 | 學習了繼承與多態的關系,以及接口的多態操作 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟件工程軟件的估計為什么這么難,軟件工程 估計方法
計劃學習時間:25小時
實際學習時間:18小時
改進情況:這周的學習任務不算輕松,本應花費再多一點的時間理解學習。以后還是應該提高學習效率,同時擠出時間進行深入思考,鞏固薄弱知識點。
有空多看看現代軟件工程 課件 軟件工程師能力自我評價表
參考資料
Java學習筆記(第8版)
《Java學習筆記(第8版)》學習指導
JAVA字符串格式化-String.format()的使用
面向對象原則:高內聚、低耦合。多聚合、少繼承
java 高內聚,低耦合的理解
linux命令之grep用法
java.util.Arrays.fill()的使用概談
java靜態分配和動態分配
Java中abstract class 和 interface 的解釋和他們的異同點
java中重載與重寫的區別
java中的length屬性,length()方法,size()方法
super,this的區別和使用
java提高篇(四)-----抽象類與接口
Java魔法堂:String.format詳解
轉載于:https://www.cnblogs.com/Vivian517/p/6576609.html
總結
以上是生活随笔為你收集整理的20155303 2016-2017-2 《Java程序设计》第四周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2的工作原理及工作流程
- 下一篇: 【Java单例模式】Java单例模式之懒