學號20172328《程序設計與數據結構》第七周學習總結
第九章教材學習內容總結
- 1.繼承的概念:
- 繼承是在父類和子類之間建立一種“是”的關系。
- 用於派生新類的原始類稱為父類、超類或基類,被派生出的類就稱為子類或者亞類。
- 2.繼承具有單向性。java中用extends來表示新類由現有類派生。
- 3.protected修飾符:當變量聲明為protected可見性時,子類就可以引用它,並且使父類保持了一定的封裝性。
(在UML圖中,用#表示protected可見性。) - 4.super引用,使用super引用可以訪問父類的成員。子類構造方法負責調用父類構造方法,而且應該在子類的構造方法的第一行用super()引用調用父類構造方法。
- 5.java的繼承方法為單繼承,即子類只能有唯一的父類。在java中可以依賴接口實現多繼承,
- 6.重寫方法:即子類和父類里面有相同的方法和簽名時,子類方法可以重寫父類方法,子類方法優先。調用方法的對象決定決定了哪一個版本的方法將被實際執行。
- 7.影子變量:如果在一個子類中聲明一個同名變量,則該變量稱為影子變量。
- 8.類層次結構:繼承關系通常發展成一個類層次結構。在類層次結構中,應當重視合理將類的公共特征保持在盡可能高的層級上。
- 9.所有的類都是直接或者間接由object類派生。object類定義在Java標准類庫的java.lang包中。
- 10.final修飾符可以限制繼承的能力。用final修飾符聲明方法,使得該方法在任何派生類中不能被重寫。
教材學習中的問題和解決過程
-
問題1:變量聲明為protected可見性的封裝性不如private可見性嚴格,但比public可見性很強。
-
1.(〃'▽'〃)本題解答:
-
public:具有最大的訪問權限,可以訪問任何一個在classpath下的類、接口、異常等。它往往用於對外的情況,也就是對象或類對外的一種接口的形式。
-
protected:主要的作用就是用來保護子類的。它的含義在於子類可以用它修飾的成員,其他的不可以,它相當於傳遞給子類的一種繼承的東西
-
default:有時候也稱為friendly,它是針對本包訪問而設計的,任何處於本包下的類、接口、異常等,都可以相互訪問,即使是父類沒有用protected修飾的成員也可以。
-
private:訪問權限僅限於類的內部,是一種封裝的體現,例如,大多數成員變量都是修飾符為private的,它們不希望被其他任何外部的類訪問。
-
-
問題2:類的派生代表什么關系?
-
2.(〃'▽'〃)本題解答:繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力,是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。
-
問題3:抽象類和接口的區別?
-
3.(〃'▽'〃)本題解答:abstract class和interface是Java語言中對於抽象類定義進行支持的兩種機制,正是由於這兩種機制的存在,才賦予了Java強大的面向對象能力。 abstract class和interface之間在對於抽象類定義的支持方面具有很大的相似性,甚至可以相互替換。
抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。抽象類要被子類繼承,接口要被類實現。接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現。接口里定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那么該子類只能是抽象類。同樣,一個類實現接口的時候,如不能全部實現接口方法,那么該類也只能為抽象類。抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。抽象類里可以沒有抽象方法。如果一個類里有抽象方法,那么這個類只能是抽象類。抽象方法要被實現,所以不能是靜態的,也不能是私有的。接口可繼承接口,並可多繼承接口,但類只能單方面繼承。
代碼調試中的問題和解決過程
-
問題1:在做pp9.1時出現錯誤提示,標明int型不能被應用,但是之前父類MonetaryCoin中我設置面值類型是int類,將其相加之后毋庸置疑還應該是int型,所以很不解。



-
1.(〃'▽'〃)本題解答:和伙伴郭愷討論之后,他告訴我父類中faceValue初始化有錯誤,並且我創建的CoinMonetary的對象one數組不能直接相加等於int型變量Sum。因此,錯誤出在了沒有認真將對象和方法辨別清楚。

-
問題2:同樣是在做pp9.1時,自己想使用父類Coin中的隨機數擲硬幣方法filp並讓其順序輸出,當時想到用for-each來做,但是好像思路不正確,也做不出來。
-
2.(〃'▽'〃)本題解答:結對小組超級好用,隨即求助大佬。問題迎刃而解,並且還小小的學習了一下for循環和for-each循環的區別。for-each循環
我們經過討論(其實是我在聽講),用了兩種方法來輸出Coin類的filp方法,並將其全部輸出。

代碼托管(statistics.sh腳本的運行結果截圖)

上周考試錯題總結
- 問題1: In Java, arrays are(在java中,數組是)
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(字符串) -
問題1分析和領悟:選擇B,在Java中,數組被實現為對象。變量是存儲整個數組的內存塊的引用變量。 - 問題2: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?(如果一個int數組作為參數傳遞給方法,下面哪個選項可以為方法頭定義參數列表?)
A . (int[ ])
B . (int a[ ])
C . (int[ ] a)
D . (int a)
E . (a[ ]) -
問題2分析和領悟:選擇C,參數被定義為變量最初被聲明為類型參數名稱。這里,類型為int[],參數為a。當時我覺得B、C一樣都可以聲明數組,沒有好好考慮直接排除了。 - 問題3:Assume that BankAccount is a predefined class and that the declaration BankAccount[ ] firstEmpireBank; has already been performed. Then the following instruction reserves memory space for
firstEmpireBank = new BankAccount[1000];(假設BankAccount是一個預定義的類,並且該聲明BankAccount[] firstrebank;已經被執行。然后,下面的指令存儲內存空間。)
A . a reference variable to the memory that stores all 1000 BankAccount entries(存儲所有1000個BankAccount條目的內存的引用變量。)
B . 1000 reference variables, each of which point to a single BankAccount entry(1000個參考變量,每個變量指向一個銀行帳戶條目。)
C . a single BankAccount entry(一個BankAccount條目)
D . 1000 BankAccount entries(1000個BankAccount條目)
E . 1000 reference variables and 1000 BankAccount entries(1000個參考變量和1000個BankAccount條目) -
問題3分析和領悟:第一次銀行帳戶;為firstentity銀行保留內存空間,它本身是指向BankAccount[]對象的引用變量。實例化BankAccount[]對象為1000個BankAccount對象。語句保留了1000個引用變量的內存空間。請注意,這1000個銀行中沒有一個對象。 - 問題4:Given the following declarations, which of the following variables are arrays?(給定以下聲明,下列哪個變量是數組?)
int[]a、b;
int c,d[];
A . a
B . a and b
C . a and d
D . a, b and d
E . a, b, c and d -
問題4分析和領悟:選擇D,第一個聲明聲明a和b都是int數組。第二個聲明聲明c和d是int型,但d是一個int數組,c是變量。a b和d都是int數組。 - 問題5:If a and b are both int arrays, then a = b; will(如果a和b都是int數組,那么a = b;將)
A . create an alias(創建一個別名)
B . copy all elements of b into a(將b的所有元素復制到a中)
C . copy the 0th element of b into the 0th element of a(把b的第0個元素復制到a的第0個元素中。)
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(如果b的每個對應元素都等於a的對應元素(即a[0] = b[0], a[1] = b[1]等),則返回true,否則返回false)
E . return true if a and b are aliases and return false otherwise(如果A 和B 是數組就返回ture,否則返回false) -
問題5分析和領悟:選擇A,“=”是一個賦值運算符。如果兩個變量都是原語,比左邊的變量副本右邊變量(如果a和b是int值,b = 5,然后將成為5)。然而,因為a和b是數組的引用變量設置為參考變量b,導致a和b都引用同一個數組在內存中,或者他們現在彼此的別名。 - 問題6: 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.(Java主方法使用參數(String[] variable),以便用戶可以運行程序並提供“命令行”參數。由於參數是一個字符串數組,因此用戶不必提供任何參數。)
A.True
B.Flase -
問題6分析和領悟: 主方法需要參數,以防程序員希望允許用戶提供命令行參數。在java命令之后,在命令行輸入的任何內容都將被接受為命令行參數。如果是由空格分隔的幾個單詞,那么每個單詞都作為一個單獨的字符串數組元素存儲。 - 問題7: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.(在java中,一個數組只能儲存一種類型的數據,舉個例子,你不能將浮點型和字符串型放一起。)
-
問題7分析和領悟:選擇true, 數組被稱為同構類型。這意味着存儲在數組中的值的類型必須與每個元素相同。類型由聲明決定。因此,int[] x只使x為int值的數組。因此,沒有數組可以同時存儲double型和String型。 - 問題8: So long as one is only accessing the elements of an ArrayList, its efficiency is about the same as that of an array. It's only when one begins to insert or remove elements towards the front portion of an ArrayList that its efficiency deteriorates.(只要只訪問ArrayList的元素,它的效率與數組的效率差不多。只有當一個人開始在ArrayList的前部分插入或移除元素時,它的效率才會變差)
-
問題8分析和領悟:選擇Ture,ArrayList是作為數組實現的,只要其中一個只是訪問ArrayList的元素,效率與數組的效率是一樣的。但是,當對ArrayList的前部分進行插入或刪除時,就會發生大量的元素復制,從而降低其效率。
結對及互評
點評模板:
- 博客中值得學習的或問題:
- 20172301:博客內容豐富多彩,很明確的點出了本章學習的難點和易混點,很容易讓人把握重點知識,參考資料很多,博客內容很充分。如果說還有點美中不足的話,就是錯題的改正比較簡短,雖然我也很簡短哈哈,下次可以一起充實一下錯題學習內容。
- 20172304:博客內容妙趣橫生,可讀性強。內容有點單薄,希望可以增加一點,更加完善一點。
- 代碼中值得學習的或問題:
代碼中值得學習的地方很多。簡要分析就是一個類或者測試程序結構的細節完整性,方法應用的熟練性,多種示例編寫的快速簡潔性。
點評過的同學博客和代碼
- 本周結對學習情況
-20172301
-20172304- 結對學習內容
- 通過練習pp9.1了解到數組對象和方法之間的區別。
- 學習了如何在類中寫toString方法。
- 討論了方法重載和方法重寫的區別。
- 一起學習了for循環和for-each循環的區別和基礎用法。
- 結對學習內容
- 上周博客互評情況
其他(感悟、思考等,可選)
繼承是我們在學習第七章(7.4)時若隱若現出現的內容,當時沒有去思考、去感悟、只簡單層次的了解了類之間的調用和聚合關系;其實在學習過程中遺忘的還是蠻快的,這周的心得就是在向前走的時候也回頭看看,不讓自己丟太多,也讓自己融會貫通新知與舊識。In conclusion:I have nothing to offer but blood ,toil,tears and sweat.
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
|---|---|---|---|
| 目標 | 5000行 | 30篇 | 400小時 |
| 第一周 | 100/100 | 1/1 | 15/15 |
| 第二周 | 377/477 | 1/2 | 20/35 |
| 第三周 | 280/757 | 2/4 | 22/57 |
| 第四周 | 973/1730 | 1/5 | 35/92 |
| 第五周 | 1000/2730 | 1/6 | 40/132 |
| 第六周 | 729 /3459 | 1/7 | 40/172 |
| 第七周 | 660/4119 | 2/9 | 30/192 |
