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

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

教材學習內容總結

繼承
1.父類與子類,子類繼承了父類的全部方法和變量,即便聲明爲private(會爲變量預留內存空間,但不能按名引用父類private成員),但不會繼承父類構造方法(由於那毫無心義)
2.子類有時會用到父類的構造方法,,須要用super引用(子類的構造方法第一行用super引用且必須是第一行,若是不寫,Java會自動產生一行super())
3.Java不容許多繼承(由於會沒法處理好多個類中同名方法的引用),可是Java能夠用接口來實現多個類的交互(這樣就減小了歧義)
4.重寫方法:子類出現與父類的相同方法名時,子類方法優先(重寫父類方法,我以爲這也是繼承的一種目的:好比一個類裏的方法被另外一個類繼承以後,會根據本身類的特色重寫適合本身這個的方法,好比,toString)
影子變量:合法但不提倡
5.全部的類都由object類派生html

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

  • 問題1:關於繼承的第一個疑問就是:書上說「經過繼承,新類自動包含了原始類的變量和方法,而後程序員能夠將新變量和方法添加到派生的新類或者修改所繼承的變量與方法」。那問題就是既然繼承會自動包含原始類的變量和方法,那爲何不直接在原來的類裏面改動呢,或者複製一下,怎麼改動不均可以嗎?不是更快捷方便嗎?java

  • 問題1解決過程:百度。繼承的意義確實很重要。
    1.實際上,直接在原有代碼上改是能夠的,但問題是你不知道你的修改會對使用這個類的別的代碼產生什麼影響。
    2.拷貝原代碼再修改,這樣原來的代碼做者想要修正的bug,拷貝後的代碼沒法更新,bug依然保留。並且後期修改代碼會很難修改。
    3.繼承還有一個做用:容許被調用者寫出代碼,同時容許調用者「填空」,實現對流程的複用(不是很懂)
    4.繼承實現了代碼的複用,衍生出各類架構,抽象多態的解釋,代碼更優雅,代碼組織架構更好。git

  • 問題2:書上說「protected的封裝性不如private嚴格,但比public更強」。後面又說「聲明爲protected可見性的變量和方法除了可被子類引用外,還能夠由同一個包內的任何類引用」。若是是這樣的話,那還爲何要聲明成protected,直接public不是同樣的嗎?即便是public,一個類想要引用另外一個類也必需要放在同一個文件夾下才能引用啊?protected比public的封裝性的強處徹底沒體現出來啊。程序員

  • 問題2解決過程:等待藍墨雲的解答。
    【更新】emmm,忽然爲本身的智商感到了擔心......並非非得要在一個包裏才能調用另外一個類,用import聲明就行了(我居然忘了這個......),另外嘗試了王老師說的,若是另外一個類裏的變量聲明是protected,若是不是它的子類調用它的話,就算是import也不能夠。編程

  • 問題3:書上說「構造方法不會被繼承,子類擁有父類的構造方法是沒有任何意義的,子類沒有必要繼承父類的構造方法」,「子類可能須要引用父類的構造方法」。目前所知道的構造方法的做用就是初始化變量。而直接在子類構造方法中設置變量可能比super引用更容易,可是父類若是作了修改,相應的子類構造方法中也要進行相應修改。若是是這樣的話那爲何不直接繼承過來?書上還說:「構造方法的第一行應該用super引用調用父類構造方法,若是不存在這樣的調用,Java會自動在構造方法的開始處產生一行super()調用」既然是這樣,跟繼承好像也沒什麼區別,父類的變量繼承過來也要初始化才能用吧。數組

  • 問題3解決過程:百度。構造方法是特殊的方法,之因此不能繼承是由於構造方法要與類同名,若是構造方法被繼承,那麼它確定和子類的名字不一樣,並且他也沒有返回值,編譯確定是通不過的。架構

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

  • 問題1:課後習題PP9.1。編程要求在類裏聲明一個變量用於保存硬幣面值,並要求編寫一個main驅動類實例化對象並計算若干個對象的和。dom

  • 問題1解決過程:本身思考+參考同窗代碼。按照我一開始的思考,寫的代碼如圖:

    首先要解決的是第一個問題是如何聲明一個變量用於保存硬幣面值,面值有不少種,因此這裏很容易想到用一維數組來表示,而後設計一個方法來隨機產生數組裏的索引值,從而返回索引位置處保存的面值數。代碼如圖:

    第一個方塊的部分就是聲明的用於保存硬幣面值的數組,第二個方塊就是所寫的方法,將索引處的值賦給value。
    而第二個要解決的問題是如何計算若干個對象的和。首先我想到的思路是:若干個就是用戶想要多少個,因此第一張圖所示,我設計了與用戶交互,而後用for循環計算每一次產生出來的面值,再加起來。然而這個循環在運行的時候出現了兩個問題:第一就是這個.flips()方法,每一次循環產生的結果都是同樣的,這讓我意識到一個變量是行不通的,要產生多少個值,就須要多少個對象,這就讓個人用戶輸入變得複雜了,由於要實例化的對象個數也是變化的(若是用數組的話應該也能夠解決這個問題)。第二個問題就是我發現每次調用隨機產生面值的方法並非隨機的,測試了一下,它只能產生數組中索引值爲0處的面值大小,而如第二張圖的第二個方塊的代碼所示,我寫的方法應該沒有問題。
    原本是要接着寫下去的,可是參考了其餘同窗的代碼,發現我好像會錯了意,若干個代碼應該指的是我所保存的硬幣面值的個數......因而從新寫了代碼如圖:

    按道理來講,應該符合題意的,但結果並不正確,我輸出了三次的值(而且是用了三個對象),但最後的三個數的和並不正確。跟一開始想的同樣,第一次對象a調用的flips方法產生了一個面值,可是我在算總和的時候又調用了一次,因此兩次產生的值不一樣,計算的時候用的是後面產生的值。但問題是這就跟我前面發現的那個問題產生了矛盾,明明以前每一次調用同一個對象的同一個方法產生的值是同樣的。。。無奈只好把產生的值賦給一個變量了,最終的代碼如圖:

    還有上面說的那個爲何每次產生的面值老是數組裏索引爲0處的大小。我想了一下,一開始用的是Math類的random方法,而後乘的3,感受不妥,因而換用了random類的nenxtInt方法,最後解決了問題。性能

  • 問題2:課後習題9.3。題目要求寫一組類,在每一個類中定義描述其各類屬性的值和輸出相應信息的方法,最後建立main驅動類實例化並使用這些類。學習

  • 問題2解決方案:首先看到這個題目的時候,我以爲有三種作法。我本身只作了第一種最簡單的方法(若是有時間我想嘗試一下剩下兩種作法,而後在博客下面補充更新)。如圖是我寫的驅動類和其中一個類的代碼:


    直接將類實例化,寫好實參,再挨個輸出就好了。而類裏,在構造方法裏設置好形參,寫兩個返回信息的方法,再寫個toString就結束了。這樣勉強算是完成了題目的要求,但很顯然沒怎麼用到本章知識。
    因此說到這第二種方法就是利用本章的繼承,只要在開始extended相應的類就行了,可是在寫的時候,有個問題就是,Java是不支持多繼承的,因此沒辦法在一個驅動類程序中使用這些類(若是把他們寫成接口應該就能夠了),因此這種方法要用的話就要爲每一個類寫一個驅動類程序(很麻煩......),也不怎麼符合一個main驅動類的題意,並且繼承的話,若是不是要用到具體返回某個屬性值的話,也用不上繼承,在構造方法裏寫就足夠了。
    第三種方法我以爲是最綜合的,應該能行的通吧。個人設想是,直接在一個類裏面聲明一個數組,用於儲存這些類,而後在下面分別編寫這些類,這樣在寫驅動類程序的時候,只要
    繼承這一個類,就能夠經過調用數組裏特定索引處保存的類及其中的方法。

代碼託管

上週考試錯題總結

  • 錯題1:

  • 錯題1解析:數組被初始化爲= new type[x],其中x是數組的大小。然而,該數組的法律索引爲0到x - 1,所以,程序員一般都是離線的,由於程序員將編寫代碼來嘗試訪問索引1到x。

  • 錯題2:

  • 錯題2解析:參數被定義爲變量最初被聲明爲類型參數名稱。這裏,類型爲int[],參數爲a。

  • 錯題3:

  • 錯題3解析:第一次銀行賬戶;爲firstentity銀行保留內存空間,它自己是指向BankAccount[]對象的引用變量。第一次銀行帳戶=新銀行帳戶[1000];實例化BankAccount[]對象爲1000個BankAccount對象。這意味着第一個帝國銀行[0]和第一個帝國銀行[1]和第一個帝國銀行[999]如今都是合法的引用,每個都是一個參考變量,由於每一個引用都是一個BankAccount對象。所以,語句保留了1000個引用變量的內存空間。1000個BankAccount對象都沒有實例化,所以沒有爲任何實際的BankAccount對象預留內存。

  • 錯題4:

  • 錯題4解析:數組索引必須是一個int值,因此若是x不是int,那麼一般值[x]會致使語法錯誤,可是Java編譯器會自動將x轉換爲int,若是它能夠被轉換的話。字符經過將char值轉換爲等效的ASCII值來轉換爲int類型。所以,若是x是'a',它被轉換爲int 97,所以值[x]訪問值[97]。

  • 錯題5:

  • 錯題5解析:「=」是一個賦值運算符。若是兩個變量都是原語,比左邊的變量副本右邊變量(若是a和b是int值,b = 5,而後將成爲5)。然而,由於a和b是數組的引用變量設置爲參考變量b,致使a和b都引用同一個數組在內存中,或者他們如今彼此的別名。

  • 錯題6:

  • 錯題6解析:主方法須要參數,以防程序員但願容許用戶提供命令行參數。在java命令以後,在命令行輸入的任何內容都將被接受爲命令行參數。若是是由空格分隔的幾個單詞,那麼每一個單詞都做爲一個單獨的字符串數組元素存儲。例如,「java foo。class hi there「將在變量[0]和變量[1]中存儲「hi」,以供程序使用。

  • 錯題7:

  • 錯題7解析:數組被稱爲同構類型。這意味着存儲在數組中的值的類型必須與每一個元素相同。類型由聲明決定。所以,int[] x只使x爲int值的數組。所以,沒有數組能夠存儲雙精度和字符串。

  • 錯題8:

  • 錯題8解析:數組的一個缺點是它的固定大小。一旦實例化,它的大小是固定的,所以,若是一個程序試圖添加比數組大小更多的元素,它會致使一個異常被拋出。ArrayList是一個使用數組的類,它會自動建立一個更大的數組,將舊數組複製到新數組中,這樣ArrayList就能夠根據須要更大。雖然這能夠解決拋出異常的問題,但它確實會致使性能較差,由於每次增長ArrayList大小時,必須從一個數組複製到另外一個數組。

  • 錯題9:

  • 錯題9解析:ArrayList是做爲數組實現的,只要其中一個只是訪問ArrayList的元素,效率與數組的效率是同樣的。可是,當對ArrayList的前部分進行插入或刪除時,就會發生大量的元素複製,從而下降其效率。

結對及互評

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

參考資料

相關文章
相關標籤/搜索