20145302 《Java程式設計》第四周學習總結
教材學習內容總結
第六章
- 繼承共同行為
- 物件導向中,子類繼承父類,避免重複的行為定義,不過並非為了避免重複定義行為就使用繼承。
- 程式程式碼重複在程式設計上就是不好的訊號,多個類間出現重複的程式程式碼時,設計上可考慮的改進方式之一,就是把相同的程式程式碼提升為父類。
- 在java中,繼承時使用
extends
關鍵字,private
成員也會被繼承,只不過子類無法直接存取,必須通過父類提供的方法來存取(若父類願意提供訪問方法的話)。
- 多型與is-a
- 在java中,子類只能繼承一個父類,並且子類與父類之間有一種is-a的關係。
- 多型,抽象的說,就是使用單一介面操作多種型別的物件。
- 重新定義行為在繼承父類之後,定義與父類中相同的方法部署,但執行內容不同,這稱為重新定義(Override)。在重新定義父類中某個方法的時候,子類必須撰寫與父類方法中相同的簽署。
- 抽象方法、抽象類如果某個方法區塊中真的沒有任何程式程式碼操作,可以使用abstract標示該方法public abstract void fight,定義不完整的類就不能用來生成例項,內含抽象方法的類也一定要定義為不完整的抽象類,子類繼承抽象類,對於抽象方法,一種是繼續標示其為抽象類,另一種就是操作抽象方法。
- protected成員java中有
public
、protected
、private
三個許可權關鍵字,但實際上有四個許可權範圍。 - 重新定義的細節
- 如果想取得父類中的方法定義,可以在呼叫方法前,加上
super
關鍵字。 - 重新定義方法要注意,對於父類中的方法許可權,只能擴大不能縮小。
- 在JDK5後,重新定義方法時,如果返回型別是父類中方法返回型別的子類,也可以通過編譯。
- 再看建構函式在建立子類例項後,會先進行父類定義的初始流程,在進行子類定義的初始流程,如果子類構造父類函式中沒有指定執行父類中哪個建構函式,預設會呼叫父類中無引數建構函式如果父類中定義了建構函式,子類建構函式時就要注意呼叫父類中的哪個函式。
- 再看final關鍵字
- 如果
class
前使用了final
關鍵字定義,那麼表示這個類是最後一個了,不會再有子類,也就是不能被繼承。 - 定義方法時,也可以限定該方法為
final
,這表示最後一次定義方法了,也就是子類不可以重新定義final
方法。
- java.lang.object
- 如果定義類時沒有使用
extends
關鍵字指定繼承任何類,那一定是繼承java.lang,Object
。 - 在java中,任何類追溯至最上層父類,一定就是
java.lang.Objet
。
- 垃圾收集
- 對於不再有用的物件,JVM有垃圾收集機制,收集到的垃圾物件所佔據的記憶體空間,會被垃圾收集器釋放。
- 在執行過程中,無法通過變數參考的物件,就是GC認定的垃圾物件。
- 再看抽象類在不確定執行環境的時候,可以先建立出ConsoleGame例項,執行
go()
方法過程中呼叫到print()
、nextInt()
或println()
等方法時,都是執行ConsoleGame中定義的流程。
第七章
- 介面定義行為
- 對於定義行為,可以使用
interace
關鍵字定義,介面中的方法不能操作,直接標示為abstract
,而且一定是public
。 - 操作某介面時,對介面中定義的方法有兩種操作方式,一是操作介面中定義的方法,二是再度將該方法表示為
abstract
。 - 繼承會有“是一種”關係,而操作介面表示“擁有行為”。
- 行為的多型與繼承相同,也可以讓一個物件強行扮演(cast)某種行為,與多型相同,只要是操作同一個介面的類都可以擁有介面的行為,可維護型也同時得到了較大的提高。
- 解決需求變化在java中類可以操作兩個以上的類,可以同時繼承某個類並操作某些介面;於此同時,java中介面可以繼承自另一個介面,也就是繼承父介面行為,再在子介面中額外定義行為。
- 介面的預設可以使用介面列舉常數,只能定義為
public static final
,如果有兩個介面都定義了方法,操作的兩個介面的類並不會有錯誤,照樣會通過編譯,所以要在設計時注意一下。 - 使用enum列舉常數
enum
實際上定義了類,而enum
中列舉的常數,實際上是public static final
,而且為列舉型別例項,無法撰寫程式直接例項化列舉型別,因為建構函式許可權設定為private
,只有類中才可以例項化。
教材學習中的問題和解決過程
- 這兩章的聯絡比較緊密,一定得把前方的知識都搞懂了,循序漸進才能一步步的將程式碼看懂,這就很尷尬了,函式各種呼叫,在學習狀態不好,精神疲憊的時候是無法參透程式碼的含義的,子類,父類,繼承,介面,多型,列舉常數等含義都要反覆的看,否則不好理解。
程式碼除錯中的問題和解決過程
- 問題在模仿Game遊戲程式碼時,我將Game中的遊戲程式碼都放到了一個包裡,給“Role”、“RPG”等命名時加上了數字編號,結果發現
fight()
無法使用。 - 解決過程我發現,隨著類名稱的改變,自己在模仿書上的程式碼的同時應該注意相對應的修改一些程式碼,才可以正確的呼叫函式。而且改變了檔案的包的位置的時候,注意修改import偷懶的那個包的地址,包的巢狀中間用
.
隔開。
本週程式碼託管截圖
其他(感悟、思考等,可選)
- 這周的學習任務很繁重,而且更加抽象了,而且函式各種呼叫,不太容易看懂,必須得細心。
- 我發現,都到第七章了,良葛格的好多註釋還是“無聊的語法示範”,說明現在還在學習很基礎的知識,為了之後較熟練的應用java,我們應該紮實基礎,一週兩章感覺不太能消化完。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 1500行 | 15篇 | 400小時 | |
第一週 | 10/10 | 2/2 | 10/10 | 基礎知識 |
第二週 | 100/100 | 3/3 | 35/35 | 語法知識 |
第三週 | 300/300 | 4/4 | 60/60 | 瞭解物件 |