20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结
20172311 2017-2018-2 《程序設計與數據結構》第八周學習總結
教材學習內容總結
本周對JAVA中的多態性進行了學習
- 多態性引用能夠隨時間變化指向不同類型的對象,是通過后綁定實現的。
- 實現多態性的主要途徑有兩種:
1.由繼承實現多態性
2.利用接口實現多態性 - 使用多態解決方法的問題:
1.排序:
(1)選擇法排序
(2)插入法排序
2.搜索:
(1)線性搜索
(2)二分搜索 - 多態性設計:
多態性允許用一致性的方法實現不一致性的行為,應該訓練自己的軟件設計敏感性,善于識別能利用多態性解法的潛在問題。
教材學習中的問題和解決過程
問題1:例題10.2中的(Executive)和(Hourly)能否去掉?
例10.2的代碼如下:
public class Staff {private StaffMember[] staffList;//-----------------------------------------------------------------// Constructor: Sets up the list of staff members.//-----------------------------------------------------------------public Staff(){staffList = new StaffMember[6];staffList[0] = new Executive("Sam", "123 Main Line","555-0469", "123-45-6789", 2423.07);staffList[1] = new Employee("Carla", "456 Off Line","555-0101", "987-65-4321", 1246.15);staffList[2] = new Employee("Woody", "789 Off Rocker","555-0000", "010-20-3040", 1169.23);staffList[3] = new Hourly("Diane", "678 Fifth Ave.","555-0690", "958-47-3625", 10.55);staffList[4] = new Volunteer("Norm", "987 Suds Blvd.","555-8374");staffList[5] = new Volunteer("Cliff", "321 Duds Lane","555-7282");//題目中提到的問題處:((Executive)staffList[0]).awardBonus(500.00) ;((Hourly)staffList[3]).addHours(40);}//-----------------------------------------------------------------// Pays all staff members.//-----------------------------------------------------------------public void payday (){double amount;for (int count=0; count < staffList.length; count++){System.out.println(staffList[count]);amount = staffList[count].pay(); // polymorphicif (amount == 0.0)System.out.println("Thanks!");elseSystem.out.println("Paid: " + amount);System.out.println("-----------------------------------");}} }- 問題一解決方案:
通過分析類圖解決問題,類圖如下:
- 理解:首先Staff類中實例化的是一個StaffMember類的數組通過類圖可以看到StaffMember類中的pay()方法是抽象的,在派生出來的Volunteer和Employee類中得到了實現,最終又在Executive和Hourly類中進行了方法的重寫。也就是說(Executive)和(Hourly)不能去掉,如果去掉,首先StaffMember類中不存在pay()方法,是不成立的。總結一下就是多態情況下可能存在很多重名的方法,要在前面聲明方法來自哪個類從而對具體類的具體方法使用。
問題2:對于利用接口實現多態性的理解模糊
- 問題2解決方案:
通過搜集資料了解到:
接口相當于一種約束,它里面只包含了屬性、方法的定義,而沒有具體實現,這點類似一個抽象類,但是與抽象類不同的時它不能包含有已經實現的方法。比如:
里面的成員不用寫修飾符,是因為所有里面的都是可以對外公開的內容,都是 public 的。
它的本意是為多個不同的對象規定一個通用的規范,最常見的莫過于用來實現多態了。
通過這個接口,調用者無須知道目標對象的具體詳細信息,只需要知道它實現了這個接口,那么它便可以依據這個接口來使用這個對象了。
- 參考資料
理解接口 - 接口具體使用的實例
- 在Main方法中調用一下
其實會發現接口和抽象類實現多態很相似,只是接口更加注重的是方法的實現
上面提到接口和接口之間可以繼承,并且接口可以繼承多個接口,那么如果一個類繼承了一個有多繼承的接口時,這個類中需要將所有繼承鏈上的方法全部實現
就像下面醬紫
public interface M1{void Test1();}public interface M2{void Test2();}public interface M3{void Test3();} //下面這個接口繼承了多個接口public interface SupperInterface implements M1, M2, M3{ } //這個類繼承了一個有多個繼承的接口,所以需要實現繼承鏈上的所有方法public class Car implements SupperInterface{public void Test1(){throw new NotImplementedException();}public void Test2(){throw new NotImplementedException();}public void Test3(){throw new NotImplementedException();}}- 參考資料
使用接口
問題三:看不懂課本上給出的排序和搜索的例題
- 問題三解決方案:
通過做項目pp10.4加深了對例題的理解
pp10.4項目代碼鏈接 - 理解:以排序為例:在例10.10的Contact類中引用了一個Comparable接口,構造了equals和compareTO方法,而在例10.9的Sorting類則定義了選擇排序和插入排序的方法,最終在例10.8的驅動類PhoneList類中實現了對Contact對象的遞增排序。是多態性的一個典型的運用。
代碼調試中的問題和解決過程
問題1:編寫項目pp10.5時遇到較大麻煩,數次修改都沒有成功,問題截圖如下:
- 問題1解決方案:通過與課本上例題的仔細對比終于發現是自己的一時疏忽造成的。
問題代碼截圖如下:
改正過后的代碼截圖如下:
代碼托管
上周考試錯題總結
- 錯題1
- 理解:重載只是為具有不同參數列表的方法提供了替代方法。重寫提供了多態性,因為根據當前正在引用的對象調用適當的方法。嵌入是類中的類的封閉。抽象與多態性無關。封裝是通過使用可見性修飾符(公共的、私有的、受保護的)實現的。
- 錯題2
- 理解: 雖然繼承和接口支持多態性,但只有在具有后期綁定的情況下才會這樣做。但是,重載是多態性的一種形式(方法)名稱,多個主體,因此只要程序使用重載,多態性就會被使用。
- 錯題3
- 理解:通過每一個比較,二分查找消除了大約一半的剩余數據。這個過程將繼續,直到找到找到的元素,或者直到所有可能的數據都被刪除為止。由于有n個數據元素,所以在數據量小于一個元素之前,可以將數據減半的次數為log2n。
- 錯題4
- 理解:精確!由于println()在本質上是高度多態的,它能夠正確地打印各種預定義的(庫)和內置(原始)數據。
- 錯因:大腦短路!!!
- 錯題5
- 理解:方法的參數可以是多態的,使方法能夠靈活地控制其參數。要實現這一點,只需使用接口名稱或基類名稱來聲明變量。然后,參數是多態的,在執行過程中引用類的正確實例,并在執行期間訪問正確的語義。
結對及互評
點評過的同學博客和代碼
- 本周結對學習情況
20172307
結對學習內容
這周和黃宇瑭童鞋的結對學習情況可以說是落實的比較到位了,我們兩個一起討論四則運算項目的整體思路,共同設計類圖,共同輸入代碼,在輸入的時候進行交流,從而發現問題所在。希望以后再接再厲吧!!- 上周博客互評情況
- 20172305
- 20172302
- 20172301
- 20172328
- 20172316
- 20172314
20172319
感悟
唯有努力堅持,才有可能見到理想的彼岸!!繼續努力吧!!
學習進度條
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 28/28 | 1/1 | 16/16 | |
| 第二周 | 710/738 | 1/2 | 20/36 | |
| 第三周 | 426/1164 | 1/3 | 16/52 | |
| 第四周 | 1068/2232 | 2/5 | 20/72 | |
| 第五周 | 604/2928 | 1/6 | 22/94 | |
| 第六周 | 609/3537 | 1/7 | 22/116 | |
| 第七周 | 599/4136 | 1/8 | 18/134 | |
| 第八周 | 1052/5188 | 3/11 | 20/154 |
計劃學習時間:18小時
實際學習時間:20小時
改進情況:繼續努力,充分發揮結對編程的重大作用!
參考資料
《Java程序設計與數據結構教程(第二版)》
《Java程序設計與數據結構教程(第二版)》學習指導
- 藍墨云班課資源
- 舉例:接口的定義,實現,為什么要用接口,意義何在?
接口實現多態
轉載于:https://www.cnblogs.com/zhaoxiaohai/p/8978085.html
總結
以上是生活随笔為你收集整理的20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 警惕爆胎!江苏部分路面温度飚到72℃
- 下一篇: lnmp化境开启pathinfo,支持t