一. 本周學習總結
1.1 寫出你認為本周學習中比較重要的知識點關鍵詞
- 接口
- interface關鍵字
- 接口的定義和實現
- has-a
- 實現Comparable
- Comparator接口
1.2 嘗試使用思維導圖將這些關鍵詞組織起來。思維導圖如下:
二. 書面作業
1. 面向對象設計大作業(團隊項目,2-3人)
1.1 項目簡介表格:
學生 | 負責任務 | 博客地址 |
---|---|---|
黃子穎 | (類名)Shoppingcart;Taobao;Taobaothings;IAO;Main | 黃子穎博客 |
翁華輝 | (類名)User;UserList;Goods;GoodsList;CartInformation; | 翁華輝博客 |
1.2 系統常用功能框架圖
1.3 系統總體類圖
1.4 購物車、商品、系統關鍵代碼截圖(主要截取自己負責的部分)
1.5 其他:跟上次的系統比較,系統的設計等有何修改。其他感想。
首先有很多增加的部分,寫了用戶注冊和登陸,還增加了購物車中增刪商品的方法,改正了一部分之前錯誤的設計思路,比如直接在購物車中定義商品信息。現在而是改為老師推薦的方法,多寫一個類用來保存商品信息。
2. abstract:閱讀GuessGame抽象類的設計與使用源代碼
2.1 Guess改造前代碼很簡單,而改造后的代碼使用了抽象類、抽象方法,看起來更復雜,這樣的改造到底有什么好處呢?
答:改造后時候抽象類抽象方法后的輸入輸出,不和控制台綁定,可以實現更多功能。
2.2 GuessGame(改造后).java
中有抽象方法與非抽象方法,你覺得抽象類中什么樣的方法應該聲明為abstract,什么方法不需要聲明為abstract直接實現即可。
- 應該聲明為abstract:輸入輸出之類的方法、沒有具體內容實現的方法。
- 不需要聲明為abstract:有具體內容實現的方法。
2.3 重要:在這個例子中,變化的是什么,不變的是什么?嘗試結合abstract等概念進行說明。
- 變化的:輸入輸出改為抽象類(具體修改內容如下),不和控制台綁定。
public abstract void print(String text);
public abstract void println(String text);
public abstract int nextInt();
- 不變的:程序的最終結果實現是不變的。
3. Comparable與Comparator
3.1 結合PTA 7-1中你的代碼說明,為什么某個類實現了Comparable接口,就可以直接使用Arrays.sort()對該類型的數組進行排序?
答:Arrays.sort()
可對所有實現的Comparable接口的對象進行排序,具體排序的邏輯是依靠方法compareTo()
。
以下是PTA7-1中的compareTo()
方法的代碼,Arrays.sort()
依靠此方法定義的邏輯進行排序。
3.2 結合PTA 7-2 中你的代碼說明,有了Comparable接口為什么還需要Comparator接口呢?
一個類一旦實現了Comparable
,比較的方式就固定了。那如果像PTA 7-2中需要按照姓名或者名字,甚至多種方式來實現呢?這時候Comparable
就不適用了,就應該使用Comparator
。
PTA 7-2中姓名的Comparator代碼如下:
3.3 以前的作業Shape, Rectangle,Cirlce中,Shape類中什么方法應聲明為abstract?說出原因。
public double getArea()
public double getPerimeter()
因為在子類Rectangle,Cirlce中,這兩個方法都有不同的實現,Shape中沒有具體實現,所以需要聲明為abstract。
3.4 有很多Shape類型對象如Rectangle、Circle。希望使用Arrays.sort對他們進行排序,請寫出相應代碼。並簡述應在哪個類上實現Comparable接口比較好?
要用Arrays.sort可以排序必須把Shape類上實現Comparable接口,並在其中寫出compareTo方法
public int compareTo(Shape o) {
if(this.getPerimeter()-o.getPerimeter()<0)
return -1;
else if(this.getPerimeter()-o.getPerimeter()>0)
return 1;
else
return 0;
3.5 以3.4你編寫的代碼為例,簡述面向Comparable接口編程、面向父類編程的好處。(注意:一定要結合自己編寫的代碼)
面向Comparable接口編程、面向父類編程的好處:
- 在此3.4例子中,把Shape類實現了Comparable接口,這樣main函數直接使用Arrays.sort就可以直接進行排序了,而不需要多寫一個繁瑣的函數對其進行排序。
- 同時Shape類對於Rectangle、Circle來說也是他們的父類,當Rectangle、Circle里的方法進行了修改,因為Rectangle、Circle是面向父類編程所以Shape的代碼是不需要進行修改,這提升了系統的靈活性。
4. 面向接口案例分析
閱讀Case-StudentDao.zip案例
4.1 a.畫出類關系圖。b.StudentDao接口有什么用?
-
類關系圖如下:
-
StudentDao接口是interface的,他的作用是把下面的三個方法集合起來
public boolean writeStudent(Student student);
public Student readStudent(String name);
public void diplayAllStudent();
4.2 StudenDaoListImpl與StudentDaoArrayImpl有何共同之處?有何區別?
- 共同點:StudenDaoListImpl與StudentDaoArrayImpl都是接口
,都有public Student readStudent(String name)
、public void diplayAllStudent();
、public boolean writeStudent(Student student)
方法 - 不同點:雖然有相同的方法,但是其中
public Student readStudent(String name)
、public boolean writeStudent(Student student)
具體實現是不一樣的,因為一個使用數組實現,一個是使用列表實現。在StudenDaoListImpl中還多了一個構造函數public StudentDaoArrayImpl(int size)
。
4.3 結合Test.java中的main函數,簡述面向接口編程的好處。
main函數中使用public Student readStudent(String name)
、public void diplayAllStudent();
、public boolean writeStudent(Student student)
的時候無需在乎一開始是數組還是List。就像老師在Test.java中加的那個注釋
//往后台寫數據,無需考慮后台是什么(到底是數據庫、文件、數組、List)
//因為這里是面向StudentDao接口
這就是接口編程的好處。
5. 什么是面向接口編程?面向接口編程的好處是什么?
- 面向接口編程的定義:每個層次不是直接向上層提供服務的,是通過定義一組接口,只向上層暴露接口功能。在Test.java中,StudenDaoListImpl與StudentDaoArrayImpl就是兩個接口,main函數直接通過接口來調用其中的方法。
- 面向接口編程的好處:這對系統的靈活型有好處。下層需要改變的時候,只要接口的關系是不變的,只要修改下層就好了,上層不用改變。在Test.java中,如果StudenDaoListImpl或StudentDaoArrayImpl中的方法需要進行修改,那就直接在StudenDaoListImpl或StudentDaoArrayImpl中進行修改就好了,而main函數不需要進行修改。
三.碼雲及PTA
題目集:面向對象2-進階-多態接口內部類
3.1. 碼雲代碼提交記錄
3.2 截圖PTA題集完成情況圖
3.3 統計本周完成的代碼量
周次 | 行數 | 新增行數 | 文件數 | 新增文件數 |
---|---|---|---|---|
1 | 115 | 115 | 17 | 17 |
2 | 421 | 306 | 24 | 7 |
3 | 698 | 277 | 30 | 6 |
5 | 1085 | 387 | 38 | 8 |
6 | 1497 | 412 | 48 | 10 |