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



2018年學習總結博客總目錄:[第一周](http://www.cnblogs.com/hzy0628/p/8539037.html) [第二周](http://www.cnblogs.com/hzy0628/p/8584976.html) [第三周](http://www.cnblogs.com/hzy0628/p/8642935.html) [第四周](http://www.cnblogs.com/hzy0628/p/8671888.html) [第五周](http://www.cnblogs.com/hzy0628/p/8746606.html) [第六周](http://www.cnblogs.com/hzy0628/p/8830819.html) [第七周](http://www.cnblogs.com/hzy0628/p/8870071.html)

教材學習內容總結

1.創建子類:用於派生新類的原始類稱作父類、超類或基類,被派生出的類稱為子類或亞類。Java中用保留字extends來指明新類由已有類派生而得。繼承的過程是在兩個類之間建立一種“是”的關系,即子類是一種更具體的父類版本。這是一個繼承的表述:public class Dictionary extends Book,說明的是Dictionary類是由Book類派生而得來的。

2.繼承具有單向性,父類不能引用子類內部聲明的變量和方法。

3.protected修飾符:我們之前已經學過public和private兩種可見性修飾符,下面介紹protected修飾符。可見性修飾符用於控制對類成員的訪問,這種控制也延伸到繼承過程中。父類的公有方法或變量子類可是訪問調用,而私有方法或變量則不能。於是引入protected修飾符,父類中方法或變量聲明為protected可見性時,子類可以引用它,同時也可被一個包內其他類所引用。

4.繼承過程中構造函數並不會被繼承,這時我們可以使用一個保留字super引用父類,super的用處之一是可以調用父類的構造方法。super用法注意:用super引用調用父類構造方法的操作只能在子類中執行,並且必須是第一行,如果沒有這樣的調用,Java會自動在構造方法開始處產生一行super(),以確保父類構造方法初始化自己變量。下面是一個舉例:

public Dictionary2(int numpages, int numDefinitions)
    {
        super(numpages);
        definitions = numDefinitions;
    }

5.多繼承:多繼承有時效果會很好,但存在一些問題,如兩個父類中有重名方法時應該怎么處理?所以呢,Java語言明確表明不支持多繼承,但Java中支持實現多接口,可以完成類交互。

6.(1)重寫方法:子類和父類具有相同方法名和簽名時,子類方法將重寫父類方法,子類方法優先。但子類不能重寫父類中的final方法。(2)影子變量:子類中與父類具有相同的變量,子類中聲明的同名變量被稱作影子變量(shadow variable),原則上我們要避免使用影子變量,因其容易造成混淆。

7.類層次結構:同一個父類派生出的多個子類,稱為同胞。一個類的子類還可以稱為一個或多個其他類的父類,由此建立起類層次結構。

8.Java中,所有類歸根結底都是由Object類派生而來的,Object類是Java繼承樹的根節點。如果一個類沒有extends子句顯式派生,則自動從Object類派生。一個類中定義toString方法時,實際上是重寫了Object類中的toString方法,從而實現返回自己保存的字符串。

9.抽象類:抽象類可以包含抽象方法,,也可以聲明數據。在類定義聲明頭中,可用abstract修飾符將一個類聲明為抽象類,包含抽象方法的類必須聲明為抽象類,抽象方法必須用abstract修飾符,但抽象類不一定包含抽象方法。

10.對於一個抽象方法不應該使用final或static修飾符修飾,因為子類不能重寫final方法,一次無法為抽象final方法提供定義。static方法可以由類名進行調用,而不必實例化對象類調用,由於抽象方法沒喲實現代碼,抽象static方法沒有意義。

11.同時接口也可以進行派生,同類的繼承相似,但不存在(protected 和private成員)可見性問題,因為一個接口的所有成員都是公共的。要注意類不能用於派生接口。

12.父類中的私有成員也被子類繼承,只是不能以成員名進行訪問,但是可以通過某個公共的方法進行間接的訪問,如書上的【例9.10、9.11、9.12】,這里不再列舉。

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

  • 問題1:關於書上所說的super的使用方法,書上值提到一種,且說它類似於this引用,我們學過this引用是用於引用當前正在運行的對象,那么兩者到底有什么區別,同時super還可以用來做什么?

  • 問題1解決方案:從博客園的一篇博客中找到了我想要的一個答案,見下圖:

他這篇博客還較完整的解釋這些關系。讓我比較清楚的了解到super的用法及與this的區別。同時我從書上的一道例題中又看到了super的一種用法:調用子類中重寫方法的父類版本。

  • 問題2:SR9.9的b小題:子類可以重寫父類中的構造方法。錯誤。 關於這個錯誤的原因我不明白,我選的也是正確。

  • 問題2解決方案:通過查答案,找到了解釋:因為構造方法是一種特殊的方法,與類名相同,但沒有返回類型,如果試圖重寫父類的構造方法,將產生語法錯誤。還是不太明白,這個答案在解釋什么...,從網上找了一些,看完這個理解一些,就是默認就會去調用父類無參構造,沒有被重寫的可能。

子類不能重寫父類的構造函數,子類在構造函數中就會首先去調用父類的構造,默認調用的是父類的無參構造。如果你需要參數個數不同的構造,可以在父類中寫多個構造方法的。子類繼承父類的方法中不包含構造方法。

  • 后補:上課結合藍墨雲課件,以及老師所講,對這里有了更深的一些認識,見下圖:

  • 問題3:SR9.22中,為什么子類必須要重寫其父類的中的toString方法,即便是在當前的程序中該方法並沒有被子類所調用?

  • 問題3解決方案:以前也是遇到過沒有重寫的話,會產生的是對象的地址,那這里沒有使用或繼承子類時也要重寫真的是因為答案所說:以避免后面出現問題,因為以后可能有人在直接使用該子類時或繼承該子類時,會認為該子類已經存在一個有效的toString方法。

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

  • 問題1:本章中學習代碼調試中並沒有遇到太大問題,編程項目也是完成比較順利一些,一開始有些問題的就是PP9.3的題意,它給出的要求是設計並實現一組類。

  • 問題1解決方案:想了之后的感覺是應該先編寫一個父類,然后再去由這一個父類派生出這一組類,這應該是題目的意思,但是這個toString方法到底是在父類中編寫還寫子類中編寫,這個搞不清楚,又看了半天題目,可能是題目中要求的是每個子類還要有其他屬性,如果在父類中重寫了toString方法,在子類中還要重寫,就沒有在父類中重寫這個toString方法。下面是寫出的那個父類。

public class Readings
{
    protected int pages;
    protected String antisop;

    public Readings(int pages,String antisop)
    {
        this.pages = pages;
        this.antisop = antisop;
    }

    public void setPages(int numpages)
    {
        pages = numpages;
    }
    public void setAntisop(String antisop)
    {
        this.antisop = antisop;
    }

    public int getPages(int numpages)
    {
        pages = numpages;
        return pages;
    }
    public String getAntisop(String antisop)
    {
        this.antisop = antisop;
        return  antisop;
    }

}
  • 問題2:這周完成了上周並不會做的項目8.6,在這個項目的編寫中也遇到些問題,上周博客沒有補充,在這里寫一下,這里呢,首先是那個基礎的Account類,然后就是一個Tranctions類,在這個類中定義了一個數組,然后是實現這個transactions類的程序,但是在這個程序中我們創建了一個transactions對象,Transactions accts = new Transactions();,但是這個對象已經不能再使用Account類中存錢取錢操作,這個怎么解決?

  • 問題2解決方案:這個想了好久,也是一直卡着,最后是看了一下別的同學的碼雲代碼,就是在transactions類中我們可以新定義方法完成存錢和取錢的操作,見如下的代碼:

public double acctdeposit(int number,double amount)
      {
          double acctbalance = acct[number].deposit(amount);
          return  acctbalance;
      }
      public double acctwithdraw(int number,double amount,double fee)
      {
          double acctbanlance = acct[number].withdraw(amount,fee);
          return acctbanlance;
      }

這樣就可以在程序中使用這個方法完成存錢和取錢的操作。

代碼托管

  • 本周是打算用IDEA進行統計代碼的,但在IDEA 中統計結果與虛擬機上差距較大,這周先以虛擬機中代碼行數為准,下周會刪掉一些之前項目,以后使用IDEA進行統計。

上周考試錯題總結

  • 1.In Java, arrays are
    A . primitive data types
    B . objects
    C . interfaces
    D . primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
    E . Strings

  • 解析:在Java中,數組被作為對象來實現。該變量是儲存整個數組的內存塊的參考變量。然而,使用符號名稱索引而不是通過消息傳遞來訪問數組。

  • 2.The "off-by-one" error associated with arrays arises because
    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

  • 解析:數組被初始化為int [] array = new int [a],其中a是數組的大小。但這個數組的索引值為0到a - 1,有時程序員會編寫代碼來嘗試訪問索引1到a。這就導致了差一錯誤。

  • 3.If an int array is passed as a parameter to a method, which of the following would adequately define the parameter list for the method header?
    A . (int[ ])
    B . (int a[ ])
    C . (int[ ] a)
    D . (int a)
    E . (a[ ])

  • 解析:這道題被誤導了,誤以為數組作為參數傳遞與定義一個數組不同,但實際上是一致的,參數被定義為變量最初聲明為類型參數名稱。這里,類型是int,參數是a。

  • 4.If a and b are both int arrays, then a = b; will
    A . create an alias
    B . copy all elements of b into a
    C . copy the 0th element of b into the 0th element of a
    D . return true if each corresponding element of b is equal to each corresponding element of a (that is, a[0] is equal to b[0], a[1] is equal to b[1] and so forth) and return false otherwise
    E . return true if a and b are aliases and return false otherwise

  • 解析:“=”是一個賦值運算符。這里,因為a和b都是數組,他們的數據是相同的,作為對象,進行賦值后,導致在內存中a和b都引用同一個數組,所以他們現在為彼此的別名。

  • 5.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 . true
    B . false

  • 解析:main方法需要參數,以防程序員希望允許用戶提供命令行參數。在Java命令之后,在命令行輸入的任何東西都將被接受為命令行參數。如果是由空格分隔的幾個單詞,那么每個單詞都存儲為一個單獨的字符串數組元素。例如,“java foo,這里的類hi“會在變量0中存儲”hi“在變量1中”,以供程序使用。

  • 6.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 . true
    B . false

  • 解析:數組被稱為同構類型。這意味着存儲在陣列中的值的類型必須對每個元素都是相同的。類型由聲明決定。所以,int x只讓x成為int值的數組。所以,沒有數組可以同時存儲雙精度數和字符串。

結對及互評

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172308

    • 博客中值得學習的或問題:上周提出博客排版的問題后馬上做出了改觀,同時這周的博客內容也是比較充實,問題中有些也問過我,我也不是很明白,看他的博客也對那些問題有了一個理解,並且博客交的也是比較早。

    • 結對學習內容
      共同學習了第九章的學習內容,並且就他的博客中問題2進行討論過,無果,但是本身的話自己沒有那么想。

    • 上周博客互評情況

    • 20172308

其他(感悟、思考等)

感悟

  • 這周對繼承關系有了一定的認識,但本周在第九章學習的時長是比較短一些,可能是內容比較少的原因。這周的重心是放在了實驗項目上,在那上面多花了功夫。總體來說在Java上這周花的時間可能稍微少了一些,實驗項目有的做着很吃力,做不下去,有些學不進去。下周希望能多投入一點!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 157/157 1/1 15/15
第二周 382/539 1/2 16/31
第三周 317/856 2/4 15/46
第四周 996/1852 1/5 24/70
第五周 578/2330 1/6 16/86 這周對上周第七章的學習有了更深的理解
第六周 475/2805 1/7 14/100 學習了數組方面的相關知識
第七周 629/3434 1/8 14/114 關於繼承有一定認識

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM