1. 程式人生 > >20172305 《程序設計與數據結構》第八周學習總結

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

行修改 log 似的 ~~ tree ogr abs The 雲上

20172305 2017-2018-2 《程序設計與數據結構》第八周學習總結

教材學習內容總結

本周內容主要為書的10.1-10.6的內容:

  • 第十章

1.後綁定(動態綁定)

2.繼承與接口實現的多態性

3.排序(選擇排序法和插入排序法)

4.搜索(線性搜索和二分搜索)

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

  • 問題1:後綁定(動態綁定)
  • 問題1解決方案: 沒看到這裏的時候,一直認為引用變量是什麽類型的,就只能調用相關的方法。所以在每次寫類的時候,都一直盡力於完善有關的方法。動態綁定的執行效率低於早期綁定,但是動態綁定所體現的靈活性是不能比的。

    • 引用變量的類型和該引用變量指向的對象必須是兼容的,但不必完全相同,兩者的關系可以是很靈活的。
  • 問題2:多態性--面對對象的三大特征之一
  • 問題2的解決方案:java實現運行時多態性的基礎是動態方法的調度,它是一種在運行時而不是在編譯期調用重載方法的機制。多態的存在,可以對原有代碼的替換、可行的擴充,可以進行靈活多樣的操作,極大的提高了使用效率,同時通過藍墨雲上視頻內容的講解,對於數據庫內的類型進行修改或是替換到亮一個數據庫裏,我們總不能把所有數據進行調用,再進行添加吧,所以為了解決這種問題的發生,我們可以在兩者之間進行一個多態的應用,就可以極大的縮短解決事件和解決中產生的問題。

    • 多態性是指一個引用變量在不同時刻可以指向不同類型的對象。通過這種方式調用的方法在不同時刻將於不同方法實現代碼的綁定。被綁定的方法代碼取決於被引用的對象的類型。
  • 問題3:排序(選擇排序法和插入排序法)
  • 問題3的解決方案:排序的問題是用多態性解決的問題之一。本書介紹了兩種相對簡答的排序方法,我在網上又查出了冒泡排序、希爾排序、快速排序、堆排序等不同類型的排序方式(足可見出數據結構原理有多強大,有多燒腦了)

    • 相同點:相同的排序效果、同等的效率、類似的雙層循環、都執行大約n*n次的操作
    • 不同點:排序方法有所不同,選擇排序法可以是兩個數的替換所達到有一定的順序,插入排序法是進行一個個類似順時針的循環進行的排序。選擇排序法所執行的交換操作的次數相對較少,選擇法優於插入法。
  • 問題4:搜索(線性搜索和二分搜索)
  • 問題4的解決方案:線性搜索是以一個端點開始進行“逐一的”、“有順序的”搜索。二分搜索的方式類似高中數學學過的“二分法”,不斷的取中點,一半一半的進行篩選。相比線性搜索,二分搜索的效率更高,但二分搜索有一個弊病,就是數組中的元素必須是有一定的順序的(升序或者降序)對於兩種搜索方式的選擇,數據的搜索量較大的優選二分搜索,搜索的效率不是重要問題的情況下,我們可以選擇線性搜索。

    • 被搜索的一組元素稱為搜索池
    • 對於二分搜索如果是偶數個的元素,我們在第一次選擇的時候,通過代碼mid = (min + max) / 2就可以看出,除不開的情況下會選擇中間兩個數較前一個,作為中間數,進行二分的

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

  • 問題1:PP10.1
  • 問題1解決方案:10.1的編寫感覺很簡單,從繼承的轉換為接口實現多態,不就是方式的轉變。唉,實際操作的時候就突然發現無從下手,我試過在StaffMember裏面進行是是實現接口,這樣所有子類都可以使用該方法了,但是Staff的pay()始終是處於劃紅線,我又想過在各個子類裏面分別實現接口,雖然pay()沒有被劃紅線,但是聲明引用變量,並指向子類的時候,又開始劃紅線了。想了想是自己沒有在StaffMember類裏面沒有實現接口,但是如果實現接口的話,這就不算是一種多態吧,兩種很混亂的通過接口實現的多態性,算是自己在嘗試道路上的荊棘吧,在StaffMemberen類實現接口就行,最後在產片代碼中進行聲明接口的引用變量,這樣就可以在StaffMemberen內進行調用不同的對象,以及不同類型下的pay()方法,實現接口內內的方法payday()了。
    • 接口:
      技術分享圖片
    • 聲明接口的引用變量:
      技術分享圖片
  • 問題2:PP10.4
  • 問題2解決方案:對於此編程項目,著實費了不少功夫,遞減的順序在一開始就想到了把放在前面的內容放到後面就好了,但是想了想就改一個符號是不太可能吧,所以,自己就不斷在下面改來改去的,但是始終達不到所要求的目的,通過問同學如何解決的,原來自己最原先的想法是正確的。感覺題目騙人,不帶出這種重新編寫的,僅僅修改一個符號就可以了。
    技術分享圖片技術分享圖片

  • 問題3:PP10.5
  • 問題3解決方案:在編寫此項目的時候,想法很簡單,有了Sorting類就可以把movies內的名字進行按順序排列了,但是在我使用之後,就會提醒類型不兼容,才發現這兩者之間需要搭建一個橋梁才能溝通,想想本質的原因,是自己沒有想到模仿10.8--10.10三個代碼之間的聯系所導致的。只需要在CollectionDVD1裏面搭建一個CampareTo的方法,實現接口Comparable,就行了。這個項目的編寫費了一天半,通過同學的指導,才真正的頓悟此題。所以,還是自己的看書不夠細致導致的。
    • 問題不兼容:
      技術分享圖片
    • 實現的“橋梁”:
      技術分享圖片

代碼托管

技術分享圖片

上周考試錯題總結

  • 錯題1:Inheritance through an extended (derived) class supports which of the following concepts?(繼承通過擴展(派生)類來支持下列概念中的哪一個?)
    • A.interfaces
    • B.modulary
    • C.information hiding
    • D.code reuse(代碼復用)
    • E.correctness
  • 錯誤解析:通過擴展一個類並繼承它,新類不需要重新實現任何繼承的方法或實例數據,從而節省了程序員的工作量。因此,代碼重用是重用他人代碼的能力,通過擴展它來滿足您的需求。通過繼承父類可以大大的縮減代碼的重復,對於自己選擇接口類的問題,表示自己當時很迷,不知道怎麽回事就選擇了接口。

  • 錯題2:Which of the following is true regarding Java classes?(對於Java類,下面哪個選項是正確的?)
    • A.All classes must have 1 parent but may have any number of children (derived or extended) classes(所有的類都必須有一個父類,但是可能有任意數量的子類(派生的或擴展的)類。)
    • B.All classes must have 1 child (derived or extended) class but may have any number of parent classes
    • C.All classes must have 1 parent class and may have a single child (derived or extended) class
    • D.All classes can have any number (0 or more) of parent classes and any number of children (derived or extended) classes
    • E.All classes can have either 0 or 1 parent class and any number of children (derived or extended) classes
  • 錯誤解析:Java支持繼承,但不支持多重繼承,因此Java類可以有任意數量的子元素,但只有一個父類。此外,由於所有Java類都直接或間接地從對象類繼承,所有Java類都只有一個父類。在做此題的時候,考慮了終極父類--Object類,因為它沒有父類,所以選擇則了E選項,但是,老師說可以把Object類看作自己是自己的父類的問題,我也表示很無奈。心疼這一分......

  • 錯題3:A variable declared to be of one class can later reference an extended class of that class. This variable is known as(聲明為一個類的變量稍後可以引用該類的擴展類。這個變量被稱為。)
    • A.protected
    • B.derivable
    • C.cloneable
    • D.polymorphic(多態)
    • E.none of the above, a variable declared to be of one class can never reference any other type of class, even an extended class
  • 錯誤解析:術語多態意味著變量可以有多種形式。在一般情況下,Java被強烈定義為,一個變量,一旦被聲明為一個類型,就永遠不會改變為另一種類型。例外的是,多態變量可以是任何類型的派生類(盡管不是同時,變量可以從一種類型轉換為另一種類型)。多態的問題,在看過第十章之後,明白了此題的答案,通過聲明為父類的對象,就可以引用繼承父類的子類的方法,這種靈活的操作就是通過繼承實現的多態。

  • 錯題4:In order to determine the type that a polymorphic variable refers to, the decision is made(為了確定多態變量所指的類型,做出了決策。)
    • A.by the programmer at the time the program is written
    • B.by the compiler at compile time
    • C.by the operating system when the program is loaded into memory
    • D.by the Java run-time environment at run time(通過運行時的Java運行環境。)
    • E.by the user at run time
  • 錯誤解析:多態變量可以包含許多不同的類型,但是在程序執行之前,它不知道是哪一種類型。在引用變量時,必須做出決策。這個決策是由運行時環境根據變量的最新分配而做出的。這道題也是有關多態的問題,所以看過第十章之後,是動態綁定的問題,效率較早期綁定低,但是動態綁定,體現了多態的靈活性。

  • 錯題5:Using the reserved word, super, one can(使用保留字super,可以)
    • A.access a parent class‘constructor(s)
    • B.access a parent class‘methods and instance data
    • C.access a child class‘constructor(s)
    • D.access a child class‘methods and instance data
    • E.none of the above
  • 錯誤解析:保留字super提供了一種機制,用於訪問父類的方法和實例數據(不管它們是否隱藏)。此外,可以使用super來訪問父類的構造函數。正確答案是A和B的組合選項。

  • 錯題6:If you instantiate an Abstract class, the class or object you wind up with(如果您實例化一個抽象類、類或對象會得到)
    • A.is also an Abstract class
    • B.is a normal class
    • C.is an Interface
    • D.is a reference to an Object
    • E.can‘t exist you cannot instantiate an Abstract class(不能存在不能實例化一個抽象類)
  • 錯誤解析:您只能實例化具體的類而不是抽象類。但是您可以擴展抽象類和接口。

    • 抽象類其實是可以實例化的,但是他的實例化方式不是通過new方式來創建對象,而是通過父類的引用來指向子類的實例來間接地實現父類的實例化(因為子類要實例化前,一定會先實例化他的父類。這樣創建了繼承抽象類的子類的對象,也就把其父類(抽象類)給實例化了).但是:接口是不能被實例化的(接口壓根就沒有構造函數)。

  • 錯題7:A derived class has access to all of the methods of the parent class, but only the protected or public instance data of the parent class.(派生類可以訪問父類的所有方法,但只訪問父類的受保護或公共實例數據。)
    • A.true
    • B.false
  • 錯誤解析:由於方法也可以聲明為私有的,因此派生類無法訪問任何私有方法。因此,派生類只能訪問父類的受保護和公共方法和實例數據。沒有看到訪問所有方法,所以通過後半句就直接認為對了。

  • 錯題8:If class AParentClass has a protected instance data x, and AChildClass is a derived class of AParentClass, then AChildClass can access x but can not redefine x to be a different type.(如果類AParentClass有一個受保護的實例數據x,而AChildClass是一個派生類的AParentClass,那麽AChildClass可以訪問x,但不能重新定義x為另一種類型。)
    • A.true
    • B.false
  • 錯誤解析:派生類可以重新定義父類的任何實例數據或方法。父類的版本現在是隱藏的,但是可以通過使用super.x來訪問。父類的任何實例數據和方法都可以在子類裏進行重寫或是定義為不同類型。

  • 考試有關繼承的問題,作為面對對象的三大特征之一,知識點很多,如何靈活的運用需要不斷的在實踐中學習,在考試之前,就感覺自己本章學的不是很好。26道題快錯了三分之一,就和學習第五章和第六章的考試一樣,因此更要下足功夫去學習,去不斷反思自己的學習。爭取在往後的學習過程中,能夠縮短與那些優秀的學生的距離。

感悟

  學習第十章的時候,通過老師給的書上例題代碼,可以省去不少時間去理解多態性有關的知識點,但是,本周發布了一個感覺很好做的(實則並不是的)一個小組項目-四則運算的編寫,但是細細思考了一下,突然發現,本周好忙啊~~關於多態性的問題還沒有深入思考的同時還要編寫項目的UML類圖。好在還有一個五一小假可以忙裏偷閑!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 136/136 1/1 15/15
第二周 570/706 1/2 20/35
第三周 613/1319 1/3 23/58
第四周 1249/2568 1/5 30/88
第五周 904/3472 1/6 30/118
第六周 540/4012 1/7 30/118
第七周 826/4838 1/7 30/178
第八周 925/5763 2/9 45/223

參考資料

  • 藍墨雲班課
  • 抽象類可以實例化

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