教材學習內容總結
-
創建子類:
- 繼承就是從現有類派生新類的過程,通過在子類的聲明頭中寫
public class 子類名 extends 父類名;
來實現。 - 子類的實例化並不依賴於父類的實例化。
- 繼承具有單向性,父類不能引用子類中聲明的變量和方法。
- 構造方法不會繼承。
- 繼承就是從現有類派生新類的過程,通過在子類的聲明頭中寫
-
protected修飾符:
- 父類中的公共方法可以在子類中通過名稱訪問,若子類想訪問其私有方法,那么父類的方法就必須聲明為protected可見性,例如
protected int a=12;
- protected可見性提供了允許繼承的最大可能的封裝性。
- 父類中的公共方法可以在子類中通過名稱訪問,若子類想訪問其私有方法,那么父類的方法就必須聲明為protected可見性,例如
-
super引用:
- 用來調用父類的構造方法。
- 子類構造方法時,如引用父類的則例如
public 子類名(int 父類構造方法名,int 子類構造方法名)
- 如果不需要這種調用,Java會自動在構造方法的開始處產生一行super()調用,super引用的操作只能在子類中執行,並且必須是第一行執行(子類構造方法的首行)。
-
多繼承:
- 一些面向對象語言允許子類有多個父類。Java中依賴借口實現這一功能。
-
重寫方法:
- 在繼承中,子類和父類有相同的方法名和簽名時,子類方法重寫父類方法,子類優先,調用方法的對象決定了哪一個版本的方法將被實際執行(子類不能重寫final方法)。例如書上的
parked.message();
dates.message();
,進行不同的操作,產生不同的結果。
- 在繼承中,子類和父類有相同的方法名和簽名時,子類方法重寫父類方法,子類優先,調用方法的對象決定了哪一個版本的方法將被實際執行(子類不能重寫final方法)。例如書上的
-
影子變量:
- 在子類中聲明一個與父類同名的變量,該變量稱為影子變量。這種聲明引起混淆,應避免。
-
Object類:
- Java中所有的類都由Object類派生,每一個類都繼承toString方法和equals方法。
-
抽象類:
- 抽象類通常含有(不必一定)未被定義的抽象方法,不能被實例化。
- 每個抽象方法都必須使用abstract修飾符。
- 由抽象類派生出的子類必須重寫所有父類的抽象方法,否則子類仍然是抽象類。
-
可見性:
- 父類的私有可見性成員會存在於子類當中,但是不能通過成員名直接調用,可以通過調用一個能調用私有成員的方法,間接地調用。
-
繼承的限制:
- 在一個方法聲明中使用final修飾符,使得該方法在任何派生類中不能被重寫。
- final修飾符也可以作用於整個類,使得該類不能用於派生新類。
教材學習中的問題和解決過程
- 問題一:教材中在講super的引用時,提到如下,而在例9.9中的Advice類卻在最后使用了
super.message();
用super引用調用父類構造方法的操作只能在子類中進行,並且必須是在第一行執行。
- 問題一解答:當時在看到例9.9時,對Advice類沒有什么疑惑的地方,感覺很正確,可以理解,但是偶然又看到super部分的概念后,想起了這個例子,便對super要放在第一行產生了疑問,在網上查了一下super放第一行執行的原因之后,發現是我理解錯誤,我誤認為只要用到super,就必須把它放在首行。事實上,之所以super要放在第一行,是為了在初始化當前對象之前,先保證父類對象初始化,在網上也找到了相關的問題,特別注意,這是指調用父類的構造方法時,必須在子類的構造方法首行,對於父類的其他方法則沒有此要求,他們可以直接繼承。而在例9.9中,並沒有調用父類的構造方法,只是一個message方法,所以不需要。通過這個不細心的問題,加深了我對super用法的理解。
- 問題二:書上課后題SR9.9的b,“子類可以重寫父類的構造方法”,錯誤的原因。
- 問題二解答:我認為錯誤的原因是構造方法根本不可以被繼承,只能被調用,沒有修改的機會。而答案的解釋是“構造方法無返回類型,如果試圖重寫父類的構造方法,將會產生語法錯誤,因為除了構造方法之外的所有方法必須有返回。”似乎與我的原因沒關系...但同時又多了一個理解,鑒於理解的有點模糊,因此又有了第三個問題。
- 問題三:子類調用父類的構造方法的原理。
- 問題三解答:參考一個例子:
說明:如果沒有1處的無參數構造方法,那么3處一定要主動調用父類帶參數的構造方法。如果有1處的構造方法,那么3處代碼可以不要,因為Java會自動默認調用父類的無參數構造方法。記住一點:在構造子類時,一定會調用到父類的構造方法。 所以父類要么有一個默認的無參數構造,這樣Java會自動調用這個無參數的構造。如果父類沒有無參數的構造,那么就要你自己在子類的構造中,通過super()的方式調用父類的構造。所以說,子類還是不能繼承父類的構造方法,但是可以調用。class A{ public A(){} // 1:無參數構造方法。 public A(String s){} // 2. } class B extends A{ public B(String s){ super(s); // 3. } }
- 問題四:為什么子類不能繼承父類的構造方法?
- 問題四解答:關於構造方法,每個類中都有屬於自己的構造方法,即使你沒有聲明,但是java虛擬機也幫你建了一個隱式的構造方法,因此子類也一定會有自己的構造方法,所以沒有必要去繼承父類的構造方法,同時,父類構造方法用來構建父類的對象,子類的對象需要聲明自己的構造對象來創建,所以更不需要繼承。
- 問題五:抽象類到底是一個什么樣的存在?
- 問題五解答:在查閱相關資料后,找到了一個最容易理解的解釋。如下,所以說抽象類可看做一個統籌的類,並不能被實例化,所以稱作抽象類。參考如何生動的解釋為什么java中要用抽象類?
你定義一個動物類,繼承一個狗類一個貓類。你可以new一個狗類的實例,但你不能new一個動物的實例,因為不存在這樣一個不屬於任何子類的動物類實例。所以,動物類必須是抽象的。
代碼調試中的問題和解決過程
-
問題一:在IDEA中運行代碼時,總有紅色波浪線提示錯誤,但目測被標注的地方沒有哪里寫錯了。
-
問題一解決:這是在開始使用IDEA時遇到的問題,后來發現是少加了一個“}”,在后來的使用中,差不多知道了IDEA的特點,有時候它提示的錯誤的地方並不一定就是那里出問題了。
-
問題二:這次在用虛擬機push的時候遇到了兩次錯誤。
-
問題二解決:第一個錯誤是因為之前push的時候沒有進行完,有殘留,所以再次push新的時候,出現兩次不同的提交,最后我把那幾個刪掉之后就可以了。第二個錯誤在網上查找了類似的問題其中提到的解決辦法如下,其實跟之前的push失敗一樣用
git pull origin master
和git push origin master
但錯誤的原因描述不一樣。git由於不經常提交代碼所以會出現版本更新的問題
git pull(已經綁定默認遠程倉庫的情況)
或者:
git pull origin master
這個時候git命令行中分枝狀態變成了 master | MERGING,現在:
git add .
git commint -m "merge with remote"
最后git push origin master -
問題三:在輸出一長段內容時,想使用“\t”來分隔,但錯誤如圖
-
問題三解決:在IDEA中這樣輸出就是正確的,助教說可能是虛擬機有問題。在查找解決辦法的過程中了解到java里的\t是補全當前字符串長度到8的整數倍,最少1個最多8個空格。補多少要看你\t前字符串長度,比如當前字符串長度10,那么\t后長度是16,也就是補6個空格,如果當前字符串長度12,此時\t后長度是16,補4個空格。對於我的問題,沒有找到合適的解決辦法,就在虛擬機中把“\t”換成了空格。輸出來的效果一樣。
-
問題四:代碼如圖,希望輸出的per為120000/5,即為24000,但輸出總是0。
-
問題四解決:嘗試了加括號,但沒有用,最后的解決方法是把per去掉,直接在println輸出時加上“pages/pictrue”。之后詢問了助教,他指出應該定義一個per方法,如圖,並在最后的測試類中通過
book.pages()
來調用該方法才對,原因是在實例化Book對象時,那個對象並沒有使用Book類中出構造方法以外的方法,所以需要使用額外添加的方法才可以。
代碼托管
上周考試錯題總結
-
錯題一:
-
錯題一解析:在Java中,數組是對象。我在做這道題時,首先確定數組是對象,但不知道他是不是原始數據類型。但看到選項D覺得很有道理,就被他成功說服了。實際上,變量是存儲整個數組的內存塊的引用變量,而數組不是變量。
-
錯題二:
-
錯題二解析:首先是產生了1000個參考變量,每個都是一個BankAccount對象,而在察看了條目的解釋后,還是不理解條目是指什么。在這個解釋中,應該是指變量吧。參考Java流里的條目名稱是什么?emmmmm...無法理解。
-
錯題三:
-
錯題三解析:第一個中a、b都是數組,我覺得可以理解為String a,b這類的吧。但是在數組的聲明中int a[ ]與int [ ] a是等價的呀。而我當時選是因為覺得最正確的寫法是a的,所以選了一個,int[]之后的,就是數組,而int c ,d[]; c是一個整型變量,d才是數組。
-
錯題四:
-
錯題四解析:“=”是一個賦值運算符,在a=b后,由於ab都是數組,就產生了一個別名,如果其中一個是確定的數,就把他賦值給另一個。
-
錯題五:
-
錯題五解析:我在做這道題時,認為不必提供參數是以為在測試代碼中不需要確定參數,而實際上主方法需要參數,以防程序員希望允許用戶提供命令行參數。在java命令之后,在命令行輸入的任何內容都將被接受為命令行參數。
-
錯題六:
-
錯題六解析:這道題審題不仔細,沒有看到是“cannot”,以為他說的是“can”...
-
錯題七:
-
錯題七解析:做題的時候忘記了還有可變長度參數列表這種東西,可變長度參數列表通過使用省略號(…)用於指定可變的長度。
-
錯題八:
-
錯題八解析:當對ArrayList的前部分進行插入或刪除時,就會發生大量的元素復制,從而降低其效率。這里插入或刪除時,並不僅僅改變一個元素,后面的都要改變,這一點是要特別注意的。
結對及互評
點評:
-
博客中值得學習的或問題:譚鑫在代碼調試的問題中,詳細記錄了在編寫PP9.3時的過程,還附有UML圖,可以說是非常用心了,向優秀大學生低頭。王禹涵的博客整體比較簡單,部分地方沒有寫完,建議寫得詳細一點,充實自己的博客。
-
代碼中值得學習的或問題:譚鑫對代碼有清晰的認識,構思嚴密,掌握的很好,我所欠缺的就是一個清晰地腦回路。王禹涵的代碼托管打不開,顯示訪問的資源不存在。
-
基於評分標准,我給譚鑫的博客打分:13分。得分情況如下:
- 正確使用markdown語法(1分)。
- 模板要素齊全(1分)。
- 問題加分(6分)。
- 代碼量(1分)。
- 排版精美加1分
- 代碼規范加1分
- 有動手寫新代碼的加1分
- 代碼Commit Message規范的加1分
-
基於評分標准,我給王禹涵的博客打分:10分。得分情況如下:
- 有動手寫新代碼的加1分。
- 問題加分(6分)。
- 有動手寫新代碼的加1分 。
- 正確使用markdown語法(1分)。
- 模板要素齊全(1分)。
點評過的同學博客和代碼
其他
這周主要學習了繼承,這就涉及到類的編寫,由於我對第七章編寫類的掌握不是很全面,所以這周的學習提高了我編寫類的能力,對一個類的的認識更加全面,還有就是對這周的實驗作業有點一知半解,沒有細致的理解。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一周 | 93/93 | 1/1 | 20/20 |
第二周 | 305/398 | 1/2 | 20/38 |
第三周 | 328/651 | 2/4 | 25/60 |
第四周 | 1013/1689 | 1/5 | 30/90 |
第五周 | 795/2407 | 1/6 | 30/120 |
第六周 | 1117/2921 | 1/7 | 30/150 |
第七周 | 703/3511 | 1/8 | 40/190 |