作業06-接口、內部類


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM