日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 interface IInterfaceExample { int Property1 {get;set;} string Test(); }

里面的成員不用寫修飾符,是因為所有里面的都是可以對外公開的內容,都是 public 的。
它的本意是為多個不同的對象規定一個通用的規范,最常見的莫過于用來實現多態了。
通過這個接口,調用者無須知道目標對象的具體詳細信息,只需要知道它實現了這個接口,那么它便可以依據這個接口來使用這個對象了。

  • 參考資料
    理解接口
  • 接口具體使用的實例
//真的鴨子會游泳 木頭鴨子不會游泳 橡皮鴨子會游泳//不同的鴨子游泳的方式不一樣,所以在父類中我不知道怎么實現,所以這里考慮使用接口的方法public interface ISwimming{void Swim();}public class RealDuck implements ISwimming{public void Swim(){System.out.println("真的鴨子靠翅膀游泳");}}public class XPDuck implements ISwimming{public void Swim(){System.out.println("橡皮鴨子飄著游泳");}}public class MuDuck { //這里因為木頭鴨子不會游泳,所以不繼承接口也就不用實現接口中的方法}
  • 在Main方法中調用一下
static void Main(string[] args){ISwimming swim = new XPDuck();//new RealDuck();swim.Swim();//橡皮鴨子飄著游泳 }

其實會發現接口和抽象類實現多態很相似,只是接口更加注重的是方法的實現

上面提到接口和接口之間可以繼承,并且接口可以繼承多個接口,那么如果一個類繼承了一個有多繼承的接口時,這個類中需要將所有繼承鏈上的方法全部實現

就像下面醬紫

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/281/116/16
第二周710/7381/220/36
第三周426/11641/316/52
第四周1068/22322/520/72
第五周604/29281/622/94
第六周609/35371/722/116
第七周599/41361/818/134
第八周1052/51883/1120/154
  • 計劃學習時間:18小時

  • 實際學習時間:20小時

  • 改進情況:繼續努力,充分發揮結對編程的重大作用!

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導

  • 藍墨云班課資源
  • 舉例:接口的定義,實現,為什么要用接口,意義何在?
  • 接口實現多態

轉載于:https://www.cnblogs.com/zhaoxiaohai/p/8978085.html

總結

以上是生活随笔為你收集整理的20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。