1. 本周學習總結
1.1 嘗試使用思維導圖總結有關多態與接口的知識點。
1.2 可選:使用常規方法總結其他上課內容。
學習了更多markdown的知識
參考資料:
百度腦圖
XMind2. 書面作業
作業參考文件下載
1.代碼閱讀:Child壓縮包內源代碼
package parent;public class OutOfParentPackage{public static void showParentj(Parent p){System.out.println(p.j);System.out.println(p.geti());p.getj();}
}
class Parent{private int i=1;protected int j=2;protected int geti(){return i;}public void getj(){System.out.println(j);}
}
class Other{public static void showParentj(Parent p){System.out.println(p.j);System.out.println(p.geti());}}
public class Child extends Parent{public static void main(String[] args){Parent p = new Parent();Child c = new Child();c.getParenti();c.getParentj();Other.showParentj(p);}public void getParenti(){System.out.println(i);}public void getParentj(){System.out.println(super.j);System.out.println(j);System.out.println(geti());System.out.println(super.geti());}
}
1.1 com.parent包中Child.java文件能否編譯通過?哪句會出現錯誤?試改正該錯誤。并分析輸出結果。
不能通過編譯;System.out.println(i)這句會出錯;要把private改為protected;
輸出結果: 1 2 2 1 1 2 2
1.2 另外一個包中的OutOfParentPackage.java,能否編譯通過?提示什么錯誤?分析原因。
不能通過編譯;提示System.out.println(i);出錯,錯誤是the field Parent.i is not visible。因為OutOfParentPackage.java在Parent包之外。
1.3 回答:如果為了訪問到protected修飾的屬性或方法應該怎么辦?
繼承或間接繼承與這個類的子類中可以訪問。
2.abstract進階:閱讀GuessGame抽象類的設計與使用源代碼
2.1 Guess改造前代碼很簡單,而改造后的代碼使用了抽象類、抽象方法看起來很復雜,那這樣的改造到底有什么好處呢?
改造前,未使用抽象類,只能控制臺輸出; 改造后,使用了抽象類,既可以在控制臺輸出,也可以使用對話框圖形界面等輸入。
2.2 如果想將該游戲改造成圖形界面,應該進行一些什么操作?
設計一個圖形界面的類去繼承Guess中的抽象類。
2.3 結合該例子,你覺得什么時候應該使用abstract?
抽象類:用abstract關鍵字來修飾一個類時,該類叫做抽象類;抽象類必須被繼承;抽象類不能被直接實例化,它只能作為其它類的父類。 父類Guessgame需要有隨機print數字、輸入數字等方法,子類ConsoleGame有具體的方法。這時應該使用abstract。
2.4 重要:在這個例子中,變化的是什么,不變的是什么?嘗試結合abstract、繼承等概念進行說明。
在這個例子中,變化的是輸入的方法,可以采用不同的方法輸入,如從控制臺輸入、從對話框圖形界面輸入等等。不變的是抽象方法,它可以使用不同方法的輸入、輸出,完成一個猜數的游戲。 父類GuessGame使用abstract,修飾猜數字的方法,聲明而沒有實現,需要子類繼承并覆蓋父類的方法。
3.Comparable與Comparator
3.1 描述Comparable接口的用途。為什么某個類實現了Comparable接口就可以直接使用Arrays.sort對其進行排序?
用于讓此接口強行對實現它的每個類的對象進行整體排序;因為讓待排序對象所在的類實現Comparable接口,并重寫Comparable接口中的compareTo()方法,不能夠將該排序類的對象傳入到Arrays.sort
3.2 有了Comparable接口為什么還需要Comparator接口呢?
因為Comparable接口是一個內比較器,在類內部定義了一種比較方式。Comparator接口在一個獨立的類中實現比較。Comparable接口強制進行自然排序,而Comparator接口不強制進行自然排序,可以指定排序順序。
3.3 可選:使用匿名內部類、Lambda表達式實現PTA編程5-2。
4.面向接口案例分析
閱讀Case-StudentDao.zip案例
4.1 畫出類關系圖,描述每個類與接口的作用。
4.2 StudenDaoListImpl與StudentDaoArrayImpl有何區別?
StudenDaoListImpl與StudentDaoArrayImpl各自的私有屬性不同,即實現的數據結構不一樣,StudenDaoListImpl是用ArrayList實現的,而StudentDaoArrayImpl是用數組實現的。所以兩個類對于接口的抽象方法,就會有不同的實現。兩個類具體的方法不同。
5.什么是面向接口編程?面向接口編程的好處是什么?
在系統分析和架構中,分清層次和依賴關系,每個層次不是直接向其上層提供服務(即不是直接實例化在上層中),而是通過定義一組接口,僅向上層暴露其接口功能,上層對于下層僅僅是接口依賴,而不依賴具體類。 這樣做的好處是顯而易見的,首先對系統靈活性大有好處。當下層需要改變時,只要接口及接口功能不變,則上層不用做任何修改。甚至可以在不改動上層代碼時將下層整個替換掉,就像我們更換硬盤,計算機其他地方不用做任何改動,而是把原硬盤拔下來、新硬盤插上就行了,因為計算機其他部分不依賴具體硬盤,而只依賴一個IDE接口,只要硬盤實現了這個接口,就可以替換上去。從這里看,程序中的接口和現實中的接口極為相似。
題目3用到Comparable和Comparator兩個接口,通過這兩個接口,我們可以很方便地對自己定義的類進行比較,從而調用Arrays里面已經寫好的sort()方法來排序。這個過程相當于面向接口編程。題目4也是如此,在Test類里面,我們只要關心數據到底是以何種數據結構來存放,不需要管具體的底層實現。用列表,數組都可以實現寫入學生數據、讀取學生數據和遍歷學生信息的操作。
6.結對編程:面向對象設計(大作業2-非常重要)
內容:使用Java代碼完成上周做的面向對象設計大作業,需要有初步界面。實現的功能盡量簡單,少而精,只包含必要的功能,不要追求高大全。
寫出:類圖(盡量精簡,不用太多子類,兩個即可)、系統常用功能描述、關鍵代碼與界面
形式: 兩人依托碼云合作完成。請在這里貼出你們的學號、姓名與任務分工。
注意: 再過幾次課要講Java圖形界面編程,到時候要將該系統升級為圖形界面。系統的業務邏輯部分應該變化不大,變化大的是輸入與輸出部分。所以編碼的時候,輸入(Scanner)與輸出(System.out)的代碼,請不要將其與某個業務處理函數綁死。
選做加分: 給出兩人在碼云上同一項目的提交記錄截圖,額外加分。注:兩個人在碼云上新建一個項目。
參考資料:
結對編程參考資料
可以使用Processon畫圖
第6題提交作業的結構:
6.1
學生A | 學生B | 項目地址 |
---|---|---|
學生A的博客連接 | 學生B的博客連接 | 項目碼云地址 |
6.2 常用功能描述框架圖
6.3 關鍵代碼
6.4 運行界面
3. 碼云上代碼提交記錄及PTA實驗總結
題目集:jmu-Java-04-面向對象2-進階-多態接口內部類
3.1. 碼云代碼提交記錄
3.2. PTA實驗
- 接口體現了一種has-a關系,繼承體現了一種is-a關系
- 一個類可以實現多個接口
- 實現了Comparable接口的類都有一個compareTo方法
- Arrays.sort使用了Comparator接口