20172308《程序設計與數據結構》第八週學習總結

20172308 2017-2018-2 《Java程序設計》第八週學習總結

教材學習內容總結

1.多態
a.體現:
父類引用指向了本身的子類對象;
父類的引用接受本身的子類對象。(eg:父類 f = new 子類() ;
b.好處:大大提升了程序的擴展性。
c.前提:類與類之間有關係(繼承,實現)
d.弊端:提升了擴展性,但只能使用父類的引用訪問父類的成員(對於子類有的而父類沒有的方法,不能直接調用)
解決辦法:實際上這種聲明父類 f = new 子類() ;是一個類型提高的過程(向上轉型)。能夠經過子類 z =(子類)f ;強制將父類引用轉換成子類類型,而後調用子類的特有方法(這就是一個向下轉型過程)。然而能轉換的是父類引用指向了本身的子類對象是,該引用能夠被提高,也能夠被強制轉換;而若是是父類類型對象是沒法被轉成子類對象的(如,父類 f = new 父類() ; 子類 z =(子類)f ;
e.特色:在多態中,自始至終都是子類對象在作着變化。
f.類型:由繼承實現多態性;利用接口實現多態性html

2.排序
a.選擇法排序:從第一個元素開始向後掃描整個數列,將最小值與第一個元素交換位置,再從第二個元素開始向後掃描,將最小值與第二個元素交換位置,直到最後。
b.插入法排序:從第二個元素開始與第一個元素比較,第二個小則與其交換位置,不然則不交換;再從第三個元素開始,從第一個元素開始比較,直到比某個元素小則插到這個元素的前面,直到最後一個元素。
比較:兩種方法實際排序效率相同,算法執行比較操做次數相同,但選擇法排序執行交換次數更少,所以選擇法優於插入法。java

3.搜索
a.線性搜索:從一個端點開始,以線性方式掃描(與全部元素比較)整個搜索池
b.二分搜索:前提是數組元素是有序的(升序或降序),注意:排除的待搜索數據包括中點元素;若待搜索元素爲偶數個,則產生兩個中點值,選第一個爲新的中點。
比較:算法的選擇取決於具體條件(好比,待搜索數組元素爲有序排列,則二分搜索更有效率;若元素以數組形式存儲,線性搜索相對簡單)git

教材學習中的問題和解決過程

  • 問題1:如何理解多態性的弊端,即不能直接調用子類的特有方法:算法

  • 問題1解決過程:參考藍墨雲視頻;例如,父類 f = new 子類() ;f.子類方法()。這個時候這兩句話可否經過,要分爲兩個過程:一是可否經過編譯,而是可否運行。在編譯的時候,會參閱引用型變量所屬的類(即父類),是否有即將調用的方法(即 .子類方法() )。有則經過編譯,無則沒法經過編譯;編譯經過,而後是運行階段,參閱對象所屬類中(即子類)是否有調用方法。這裏還有一個須要注意的地方,就是上述所說都是針對多態中非靜態成員函數的,他們具備可覆蓋的功能,於是才體現了多態性;而若是是靜態成員(函數和變量),不論是編譯仍是運行,都參閱的是引用型所屬的類(即父類),是否有即將調用的方法。編程

  • 問題2:課本的例10.6,前面有一句話說「Executive(子類)構造方法將本身的信息傳遞給Employee構造方法」,即:

    這句話的意思不是很懂,按照個人理解應該是「子類重寫了父類的構造方法啊」。數組

  • 問題2解決過程:百度。這是C++裏的狀況,不知道適不適用:本來父類構造的時候就須要參數,子類繼承的是父類,沒有參數父類的構造函數沒法執行。傳過去的參數用於父類的構造函數執行(通俗的說,通常用於初始化父類的成員變量等)。參數是傳給父類的構造函數的。通常程序的運行順序是先從父類再到子類,若是想在子類定義時傳遞參數給父類就要顯示地調用父類的構造函數 。這裏還明白了前面的一個問題,就是爲何沒有在子類構造方法裏寫super(),編譯器會自動調用super()方法,即調用了父類的構造方法:之因此須要調用父類的構造方法是由於在父類中,可能存在私有屬性須要在其構造方法內初始化。函數

【參考資料】:
百度知道
chrisfxs的專欄
風同樣的碼農的博客學習

  • 問題3:書上說:「若是對象能夠天然地由繼承的關係關聯起來,則經過繼承實現多態性;若是對象共同存在的主要問題須要以各自不一樣的方式進行處理,則經過接口創建多態性」。這句話卻是能理解,可是我感受各自應該有其的優點吧.net

  • 問題3解決過程:百度了一下:「接口有利於代碼的擴展,而繼承則有利於代碼功能的修改」,恍然大悟。翻譯

【參考資料】:
牧羊人的世界

代碼調試中的問題和解決過程

  • 問題1:課後習題PP10.1。一開始作這個題目,感受無從下手,由於這個例題涉及了不少個類,類之間還有繼承關係,因此說要用接口來實現,不是很明白從哪裏下手

  • 問題1解決過程:參考了課本上例題前面的UML類圖,藍墨雲的視頻資源。首先是第一個問題,這個接口爲何叫Payable。猜想了一下,之因此叫這個,應該是隻要實現支付的方法(順便把toString也寫了)。而後就是寫這個接口,寫下上面所說的其它類當中的方法。接口代碼如圖:

    代碼裏我寫了支付方法有兩個,那是由於原先的類裏面的支付方法分別叫了這兩個名字,這就致使了一個問題:引用接口的類裏面不能同時實現這兩個方法,因此要把引用接口的類變成抽象類。雖然只要加上abstract就好了,可是後續的還會影響主程序的聲明,如圖:

    用接口類Payable聲明瞭對象personnel並指向了staff2,但因爲volunteer類裏有一個pay()方法必須得實現,因此在這裏還須要像上圖中同樣,重寫這個方法。其餘類也是這樣,如圖:

    這裏還有一個問題就是若是是抽象的,就沒法將其實例化,如圖:

    這就須要在實例化的時候,重寫每一個payday方法,如圖:

    因此,能夠從一開始就將全部的支付方法都叫作pay,而後重寫就沒問題了,引用的類也就不用是抽象的了。

  • 問題2:課後習題PP10.5 。Movies的原來的代碼如圖:

    這個程序是經過編寫另外一個類裏的addDVD方法來達到加入DVD信息的目的的,而後將信息儲存在DVD型的數組裏。一開始的作法是在Movies裏直接打印出這個數組,可是發現打印出來的是內存地址(並且地址名字都是同樣的),因而檢查了一下有沒有寫錯toString,然而並無。

  • 問題2解決方案:後來無奈只能直接在Movies裏面聲明瞭一個DVD數組,用於保存原先的數據。後來這樣作發現也有一個好處,就是能夠直接用那個遍歷的方法,把數據都打印出來。如圖是過程當中寫成的代碼截圖:

    如上圖,所作的修改主要體如今紅色區域:
    最上面的那個繼承是最開始的那個思路,是想經過繼承,把DVDCollection類裏的變量等繼承下來,把變量和方法都設成了public,數組對象也設成了靜態(static)。可是沒能解決問題。
    後來就採用了第二種思路,就是中間的那塊紅色區域。這樣寫就能夠直接打印出來了,而後再寫一個排序的方法,再打印一遍,對比來看排序的效果,也就是最後修改的結果,對比效果如圖:

    因此最重要的操做就是寫一個按照名字排序的類。就是寫成的代碼的第三個紅色區域調用的selectionsort2方法。對比着例題Contact方法,在DVD類裏寫下了比較的兩個對象,如圖:

    在Sorting2類裏面寫下調用上面方法的比較順序,代碼如圖:

    最終代碼如圖:

代碼託管

上週考試錯題總結

  • 錯題1:

  • 錯題1解析:這道題其實考察的就是什麼是多繼承,可是放在實際例子中,就很難去分辨了。多重繼承意味着一個給定的類繼承了多個父類。而B中的PC要不就是臺式的,要不就是筆記本式的;C中的筆記本同時繼承了PC和便攜式的特色。

  • 錯題2:

  • 錯題2解析:我以爲這題選E沒毛病啊,Object類不是全部類的父類嗎,他也有父類嗎?

  • 錯題3:

  • 錯題3解析:這個題目是真不知道啊,百度也沒找到答案,書上也沒找到啊。相同父類的兩個子類之間的關係被稱爲siblings。clone是相同對象的副本,aliases是相同的對象

  • 錯題4:

  • 錯題4解析:這一題是真的沒話說,課本198頁最下面一段。印象中當成了has-a,還覺得絕對不會錯。。。

  • 錯題5:

  • 錯題5解析:這一題錯誤的緣由在於A選項不會翻譯,好吧,其實就怪我過於依賴有道翻譯

    若是直接翻譯super class(超類),就不會作錯了

  • 錯題6:

  • 錯題6解析:。。。沒話說,答案是A和B的結合,因此哪一個答案都不對,選E。作題的時候沒敢選E,就選了一個絕壁對的(書上有原話的),沒想到仍是被套路了

  • 錯題7:

  • 錯題7解析:
    根據有道翻譯,答案B是錯的,選E.

  • 錯題8:

  • 錯題8解析:任何類均可以擴展,不管是接口、實現接口,仍是二者都沒有。除非被聲明爲final。

  • 錯題9:

  • 錯題9解析:這道題的出錯在於錯誤地理解了什麼是「access」,子類會繼承父類的全部變量和方法(包括private),併爲變量預留空間,可是子類沒法按名引用父類private成員。

  • 錯題10:

  • 錯題10解析:子類能夠從新定義父類的任何實例數據或方法,經過super.x。

  • 錯題11:

  • 錯題11解析:上面一題寫錯了,這一題確定是跟着錯了,畢竟是同一個題目。。。

結對及互評

  • 博客中值得學習的或問題:
    • 侯澤洋同窗的博客排版工整,界面很美觀
    • 問題總結作得很全面
    • 對於書上的疑惑總會想辦法解決它,這種探索的精神值得我去學習
  • 代碼中值得學習的或問題:
    • 對於編程的編寫總能找到角度去解決
  • 本週結對學習狀況
    • 20172302
    • 結對學習內容
      • 第十章內容:多態

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 309/309 1/1 20/20
第二週 269/578 1/2 18/38
第三週 236/776 1/3 22/60
第四周 507/1283 2/5 30/90
第五週 631/1914 1/6 30/120
第六週 529/2443 1/7 25/145
第七週 515/2958 1/8 25/170
第八週 1128/4086 2/10 50/220

參考資料

相關文章
相關標籤/搜索