1. 本周學習總結
1.1 面向對象學習暫告一段落,請使用思維導圖,以封裝、繼承、多態為核心概念畫一張思維導圖或相關筆記,對面向對象思想進行一個總結。
注1:關鍵詞與內容不求多,但概念之間的聯系要清晰,內容覆蓋面向對象的核心內容即可。
注2:顏色要少、連線不要復雜,必要的時候要在連線上進行說明。

1.2 可選:使用常規方法總結其他上課內容。
對匿名內部類Lambda表達式的總結:
- 匿名內部類必須繼承一個父類或實現一個接口,在匿名內部類繼承一個父類時,相當於定義了一個子類,可以大大地簡化代碼,但是匿名內部類只能被使用一次,如果要多次使用,創建一個子類或定義一個接口的方法更優
- Lambda表達式是對匿名內部類的進一步化簡,其語法形式是
參數->表達式或程序塊{...},Lambda表達式的參數類型由編譯器自動推導出來
2. 書面作業
1. clone方法
1.1 在test1包中編寫Employee類,在test2包中新建一個Test類,並在其main中新建test1包中的Employee的對象,然后使用clone方法克隆一個新對象,能否成功?為什么?
test1的Employee類

test2的Test類

使用clone方法不能克隆一個新對象,報錯是:

因此Emoloyee類中的clone方法要聲明為public,且在Test類的main中要加上throws CloneNotSupportedException
修改之后的運行結果:

1.2 如果要為自定義的類覆蓋clone方法,需注意什么?
- 用protected修飾的只能被同包的類或子類訪問,所以在為自定義的類覆蓋clone方法時,要確保該類繼承自Object類
- 自定義類中的clone方法必須與Object類中的clone方法保持參數類型和個數以及方法名稱相同
1.3 Object對象中的toString, equals, hashCode方法都使用public修飾,而clone方法卻被protected修飾,請嘗試解釋原因。為什么不聲明為public呢?
用protected修飾clone方法是出於安全性考慮,用1.1題實現的拷貝只是淺拷貝,e1,e2實際上是因為指向同一個引用而運行出來的值相同,用protected修飾保證了只能在子類或同包的類中進行克隆,而如果用public修飾clone方法,那么在任何地方都可以進行克隆,都可以隨意地改變引用指向的值,這樣會導致某一處的值變化后,其他處所有的值都跟着改變,后果不堪設想
2. 內部類
2.1 使用匿名類與Lambda表達式改寫題集面向對象2-進階-多態接口內部類的題目7-2。請貼圖關鍵代碼與運行結果,請在運行結果中出現你的學號與姓名。
使用匿名類

使用Lambda表達式

2.2. 分析下列代碼,回答shapeComparator所指向的對象與Comparator接口有什么關系?
Comparator<Shape> shapeComparator = new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) {
//你的代碼
}
};
shapeComparator所指向的對象用匿名內部類實現了Comparator接口,重寫了其中的compare方法
2.3 題集:6-1(匿名內部類)實驗總結。你覺得使用匿名內部類有什么好處?
- 實驗總結:實現ActionListener接口,不用重寫其中的方法,只要根據題目要求實現一個簡單循環就好
- 好處:大大簡化代碼,如果某個子類或接口只用到一次,不用再去創建一個子類或接口
3. PTA實驗總結
3.1 PTA(自定義接口)。並回答:相比較不寫接口,直接寫一個類包含IntegerStack相應的方法來說,定義IntegerStack接口,然后定義其實現類這種方式有什么好處?
- 實驗總結:定義一個IntegerStack接口存放棧的一些基本操作,在ArrayIntegerStack類中具體實現這些操作,主要注意棧空棧滿的條件,及空棧不能出棧,滿棧不能進棧這些要求。
- 好處:某一個類只能繼承一個父類,但是可以實現多個接口,定義一個接口,再定義接口的實現類,可以方便編程人員的發揮,編程人員可以用各種各樣不同的方法實現這個接口,后期如果這個類還想實現其他接口,可以直接加上要實現的接口,但是如果后期還想繼承其他父類,就不能再在這個類中添加了
3.2 PTA(靜態內部類)。並回答:你覺得什么時候應該使用靜態內部類?靜態內部類與內部類有什么區別?
- 實驗總結:在ArrayUtils中定義靜態內部類PairResult,在PairResult類前要加上
static關鍵字,使用類名.方法名來調用類中的靜態方法 - 什么時候應該使用靜態內部類:如果一個內部類與外部類有所聯系,但又不依賴於其外部類的實例變量,則選擇應用靜態內部類。
- 靜態內部類與內部類的區別:
靜態內部類可以有靜態的屬性和方法,內部類不能有靜態的屬性和方法
靜態內部類只能訪問外部類的靜態成員和靜態方法,而內部類則可以訪問外部類的所有方法和屬性
實例化一個靜態內部類可以直接實例化,實例化一個內部類要先實例化外部類再實例化內部類
3.3 PTA(繼承覆蓋綜合練習-Person、Student、Employee、Company)。並回答:使用Collections.sort對引用類型數組進行排序需要有一個什么前提條件?
- 實驗總結:這一題主要是編寫equals方法存在難度,用eclipse自動生成的equals方法,然后再根據老師的要求,比如使用DecimalFormat保留兩位小數,對原有的equals方法做小小小小的修改即可,在主函數中分類Student對象和Employee對象時,要用到
instanceof關鍵字 - 前提條件:使用Collections.sort進行排序需要新建ArrayList數組,且要在父類中實現Comparable或Comparator接口,重寫接口中的方法
4.大作業-繼續完善(嘗試使用接口改造你們的系統)
結對對象:靳天婷
假設在不同的實現中,購物車里的商品有的是存放在ArrayList,有的是存放在數組中。
4.1 現在希望將系統中購物車的操作抽象到相應的DAO接口。

4.2 為該接口定義至少兩個實現(如數組、列表、文件)。截圖自己負責部分的關鍵代碼,要求出現名字與學號。


4.3 給出你們的Main程序,說明定義DAO接口的好處。



運行結果:


定義Dao接口的好處:
提高安全性,方便編程人員的編寫,在本次大作業中,定義了ProductDao接口,可以用列表實現該接口,也可以用數組實現該接口,十分靈活方便
5. 代碼閱讀:PersonTest.java(abstract、多態、super)
5.1 畫出類的繼承關系

5.2 main函數的代碼實現什么功能?
創建Employee、Student、Programmer、Manager對象,將這四個對象按照年齡從小到大排序輸出
5.3 如果將子類中的super構造函數去掉行不行?
不行,子類不會繼承父類的private變量及方法,也不會繼承父類的構造方法,所以子類中必須有super構造函數,否則會出現Implicit super construct ××× is underfined,must explicitly invoke another constructor的報錯
5.4 PersonTest.java中哪里體現了多態?
重寫Person類、Student類、Employee類、Manager類、Programmer類的toString()方法體現了多態
3.碼雲及PTA
3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成情況圖



3.3 統計本周完成的代碼量

| 周次 | 總代碼量 | 新增代碼量 | 總文件數 | 新增文件數 |
|---|---|---|---|---|
| 2 | 343 | 343 | 10 | 10 |
| 3 | 498 | 498 | 8 | 8 |
| 5 | 788 | 788 | 26 | 26 |
| 6 | 536 | 536 | 16 | 16 |
| 7 | 776 | 776 | 9 | 9 |
之前一直用CodeLines1.1,但是一直跳不出前幾周的代碼量,這次竟然給跳出了,所以第一張圖片在第七周以前的代碼量都為0
