1. 程式人生 > >20172301 2017-2018-2 《程序設計與數據結構》第七周學習總結

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

pub main HERE 目標 如何使用 資料 運行 str 類圖

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

教材學習內容總結

  • 繼承:簡單來說就是在兩個類之間建立一種“”的關系。就像是馬是動物,字典是書一樣。子類是一種更具體的父類版本。但是,你能說動物就都是馬嗎?字典就都是書嗎?不可以!所以,繼承是單向的。 就是說,父類不能引用子類內部的聲明的變量和方法。
    • 在UML類圖中,空心箭頭線用於表示繼承關系,箭頭方向從子類指向父類。

?? 我一直以為UML類圖並沒有特別大的作用,但是實驗二的第五個告訴我了UML的重要性,所以還是要多多積累。

  • protected修飾符 在前面的章節我們已經知道,可見性修飾符包括:public、private、protected。

    那麽修飾符protected有什麽作用呢:

    protected 可見性提供了允許繼承的最大可能的封裝性。

    • 在UML類圖中,protected成員前加“#”符號表示protected可見性。public成員前加“+”表示public可見性。private成員前加“-”表示private可見性。
  • super 調用父類的方法和變量。
  • java的繼承方法稱為單繼承。
  • 影子變量 子類可以定義與父類同名的變量,雖然不提倡這樣做,但是這種定義是合法的
  • 接口層次結構 繼承的概念也可以用於接口,一個接口可以繼承另一個接口,並且不用考慮可見性問題(因為接口的所有成員都是公共的)
    類的繼承和接口的繼承不能重疊,即接口不能用於派生新類,類不能用於派生接口。
    • 在UML類圖中,同樣用空心箭頭線表示接口之間的繼承關系。

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

  • 問題1:首先,我先討論一下for循環和for-each循環的優缺點,是對上一章的查漏補缺。
  • 問題1解決方法:我們寫代碼的時候都遇到過什麽時候該用for循環和什麽時候該用for-each循環的情況,尤其是在數組這一章節。
    簡單來說,for-each循環的局限性就在於無法修改數組裏面的東西,它能夠做到的就是比for循環更便捷的遍歷數組。有時候,我們用for-each代替for確實能夠更加方便,讓程序更加清晰。
    有時候,對章節中的知識認識還是不夠深刻,希望自己以後可以認真理解課本。
    參考資料:
    深入理解java中for和foreach循環

  • 問題2:繼承和接口的區別
  • 問題2解決方案:java中只能單繼承,但是卻可以實現多個接口
    我們都知道繼承是一種“是”的關系,而接口呢,是擁有某種功能,能夠做什麽的關系。
    • 有一種很形象的理解:
      我們說類的繼承一般繼承的是事物的屬性,如:姓名,年齡,性別 等,而接口的繼承(或者說實現)一般是繼承事物的行為,如:行走,飛翔,遊泳(這比較抽象,在一般項目中大部分是指對某事物的增刪改查等操作)
      總之,單繼承描述了“is a”的關系,即“子is a父”
      多繼承描述了“can do”的關系,即“子can do父”

    • 還有呢,在設計層次上,他們確實也是有一定區別的:

      對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什麽子類、什麽時候怎麽實現它一概不知。比如我們只有一個貓類在這裏,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這裏,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什麽東西來實現這個飛接口,怎麽實現也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

?? 參考資料:
?? Java中繼承和接口的區別
?? Java ——基礎之繼承與接口的區別
?? java中繼承與接口的區別

  • 問題3:重寫和重載的區別。
  • 問題3解決方案:因為剛開始看書的時候認為重寫和重載是一個意思,其實不然。重寫也叫覆寫,和重載是有一定區別的。
區別點 重載 重寫(覆寫)
英文 Overloading Overiding
定義 方法名相同,參數列表不同,與返回值類型、訪問修飾符無關。 方法名相同、參數列表相同、返回值類型相同
訪問修飾符不能嚴於父類
範圍 發生在一個類當中 發生在繼承類當中

?? 參考資料:
?? 重載和重寫有什麽區別和聯系?
?? 方法重寫與方法重載的區別
?? 重載與重寫的區別

  • 問題4:如何理解類的繼承和接口的繼承不能重疊,即接口不能用於派生新類,類不能用於派生接口。
  • 問題4解決方案:和隊伍夥伴還有學長進行了探討。
    類可以繼承,接口也可以繼承。
    類與接口之間只能說實現,不能說繼承。
    比如,父類實現了接口,子類就不需要實現了。因為父類實現接口就要重載方法,而子類可以繼承父類的方法,就不需要實現接口。

?? 子接口可以繼承父接口。

比如說我們定義接口,哺乳動物,有兩個方法,跑和跳。定義子接口,馬,也會有兩個方法,跑和跳。這時候,我們寫個類,千裏馬,要實現馬這個接口,就重載跑和跳的方法,怎麽跑,怎麽跳。一日千裏,一躍千裏。這裏類就是實現了接口。

?? 類可以繼承,接口也可以繼承,但是類和接口之間是實現不是繼承。

  • 問題5:保留字super的作用。我們都知道super引用可以調用父類的構造方法。也可以用於引用父類的其他變量和方法。
  • 問題5解決方案:

    1)super(參數):調用基類中的某一個構造函數(應該為構造函數中的第一條語句)
    2)this(參數):調用本類中另一種形成的構造函數(應該為構造函數中的第一條語句)
    3)super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數據或函數,基類與派生類中有相同成員定義時如:super.變量名 super.成員函數據名(實參)
    4)this:它代表當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員數據同名,這時需用this來指明成員變量名

?? 參考資料:
?? 關鍵字super在java中的主要作用是什麽,如何使用?
?? java 構造方法中super()的作用

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

  • 項目9.1和9.3沒有大問題,主要是實驗問題。

代碼托管

(statistics.sh腳本的運行結果截圖)

上周考試錯題總結

  • A Java main method uses the parameter (String[ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters. A
    A . true
    B . false
    理解:這題我錯選了false,因為我認為在命令行下輸入的就是用戶提供的參數。但是我還是不太理解為什麽因為參數是一個字符串的數組用戶就不需要提供任何參數了。

  • The "off-by-one" error associated with arrays arises because : A
    A . the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far
    B . the last array index is at length + 1 and loops may only iterate to length, missing one
    C . the last array element ends at length - 1 and loops may go one too far
    D . programmers write a loop that goes from 0 to length - 1 whereas the array actually goes from 1 to length
    E . none of the above, the "off-by-one" error has nothing to do with arrays
    理解:這題的知識點應該是差一錯誤。書上詳細給出了解釋:

    這種錯誤由索引值比0小1或比(N-1)大1引起。

    我錯選了D,分析一下應該就是錯的。數組的索引是0到N-1,1到N肯定是不對的。而反觀A,第一個索引值是0,程序員從所以1開始或者是一個索引過遠的循環,就正好是差一錯誤。這題主要是題意理解的不夠清晰。

  • In Java, an array can only store one type of data. For instance, you cannot create an array that stores both double and String values. A
    A . true
    B . false
    理解:這題真的純屬失誤了,存儲在數組中的值的類型必須與每個元素相同,以後應該避免這種送分題的錯誤。

  • If x is a char, and values is an int array, then values[x] : D
    A . causes a syntax error
    B . causes an Exception to be thrown
    C . casts x as an int based on x‘s position in the alphabet (for instance, if x is ‘a‘ then it uses 0 and if x is ‘z‘ then it uses 25)
    D . casts x as an int based on x‘s ASCII value (for instance, if x is ‘a‘ then it uses 97 and if x is ‘z‘ then it uses 122)
    E . casts x as an int based on the digit that is stored in x (for instance, if x is ‘3‘ it uses 3) but throws an exception if x does not store a digit
    理解:我們都知道int[],中括號中的值代表的是數組索引,肯定都是int型,所以如果x是char型肯定會有錯誤,所以我選了A。但是果真如此嗎?!為了讓自己心服口服,我寫了代碼驗證。
    技術分享圖片

    由圖我們可以觀察到,並沒有報錯,程序自動將x轉換為int,字符通過將char值轉換為等效的ASCII值來轉換為int類型。因此,如果x是‘a‘,它被轉換為int 97,因此值[x]訪問值[97]。

  • An array index cannot be a float, double, boolean or String. : A
    A . true
    B . false
    理解:數組索引必須是int型,也可以像上題是char型。 但是絕對不是float,double,boolean,string型。

結對及互評

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172304

    • 20172328
      這周博客排版很整齊清新。錯題的格式也很不錯,答案寫在了分析當中,但是錯題3和錯題6似乎忘記寫正確答案了吧。以後編寫程序的時候要註意訪問器(get)和修改器(set)的使用。
      有時候,實例數據通常聲明為private可見性,需要調用方法才可以訪問和修改實例數據值。很優秀!

其他(感悟、思考等,可選)

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 122/122 1/1 20/20
第二周 487/609 1/2 18/38
第三周 482/1091 1/3 22/60
第四周 1357/2448 1/4 20/80
第五周 628/3106 1/5 20/100

| 第六周 |

參考資料

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

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

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