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值的數組。所以,沒有數組可以同時存儲雙精度數和字符串。
結對及互評
點評過的同學博客和代碼
- 本周結對學習情況
其他(感悟、思考等)
感悟
- 這周對繼承關系有了一定的認識,但本周在第九章學習的時長是比較短一些,可能是內容比較少的原因。這周的重心是放在了實驗項目上,在那上面多花了功夫。總體來說在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 | 關於繼承有一定認識 |