本週主要學習了繼承的相關知識:
1.繼承在父類和子類之間創建了一種「是」關係,即子類是一種更具體的父類版本
2.繼承具備單向性
3.父類的私有方法或變量不能在子類中訪問
4.protected可見性提供了容許繼承的最大可能的封裝性。
5.使用super引用能夠調用父類的構造方法,用super引用調用父類構造方法的操做只能在子類中執行,且必須在第一行執行,super引用也能夠引用父類的其餘變量和方法。
6.Java語言設計者明確決定不支持多繼承。能夠依靠接口提供多繼承的最好特性而不增長歧義。
7.能夠用final修飾符定義一個方法,子類將不能重寫final方法。這種技術用於保證子類必須使用的一個特定方法。
8.在類層次結構中,應當合理地將類的公共特徵保持在儘量高的類層次級上,從而最大化複用現有類的可能性,有助於軟件的維護。
9.繼承機制具備傳遞性。
10.全部的Java類都直接或間接地由Object類派生,Java程序的每個類都繼承toString方法和equals方法。重寫Object類的toString方法和equals方法通常是爲了知足用戶本身的需求。
11.抽象類的引入。
12.類的繼承和接口的繼承不能重疊,即接口不能用於派生新類,類不能用於派生接口,僅當一個類設計爲實現一個接口時,這個實現類和接口之間纔有交互。
13.父類的私有成員也被子類繼承,雖然不能以成員名直接訪問,可是能夠間接的訪問。php
package com.lib.ThinkInJava.mutilExtends; public interface Lethal { void kill(); } package com.lib.ThinkInJava.mutilExtends; public interface Monster { void destroy(); } package com.lib.ThinkInJava.mutilExtends; public interface Vampire extends Monster, Lethal { void drinkBlood(); }
Vampire接口繼承了Monster,Lethal倆個接口,並且使用了關鍵字extends,這就是java中的多繼承。
參考資料:
java中的多繼承
java接口多繼承html
問題2:對影子變量的概念理解模糊java
問題2解決方案:查閱資料瞭解到:
1.在一個類中,子類中的成員變量若是和父類中的成員變量同名,那麼即便他們類型不同,只要名字同樣。父類中的成員變量都會被隱藏。在子類中,父類的成員變量不能被簡單的用引用來訪問。而是,必須從父類的引用得到父類被隱藏的成員變量,通常來講,咱們不推薦隱藏成員變量,由於這樣會使代碼變得難以閱讀。其實,簡單來講,就是子類不會去重寫覆蓋父類的成員變量,因此成員變量的訪問不能像方法同樣使用多態去訪問。git
2.同名的實例方法被覆蓋 ,同名的靜態方法被隱藏 ,child類的getName實例方法覆蓋 了parent的getName實例方法,chind的getKind方法隱藏 了parent類的getKind方法web
3.隱藏 和覆蓋 的區別在於,子類對象轉換成父類對象後,可以訪問父類被隱藏 的變量和方法,而不能訪問父類被覆蓋 的方法數組
4.若是須要訪問父類被隱藏 的實例變量,加上super就行了,好比訪問父類的name,寫上super.name就行了
參考資料:
JAVA中方法和變量在繼承中的覆蓋和隱藏數據結構
問題3: 對課本上的抽象類概念理解模糊函數
問題3解決方案:經過查閱資料瞭解到該知識點與下一章的多態方面的知識聯繫密切。
抽象類就是爲了繼承而存在的,若是你定義了一個抽象類,卻不去繼承它,那麼等於白白建立了這個抽象類,由於你不能用它來作任何事情。對於一個父類,若是它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不一樣的實現,那麼就能夠將這個方法聲明爲abstract方法,此時這個類也就成爲abstract類了。
抽象類和普通類的主要有三點區別:學習
1)抽象方法必須爲public或者protected(由於若是爲private,則不能被子類繼承,子類便沒法實現該方法),缺省狀況下默認爲public。測試
2)抽象類不能用來建立對象;
3)若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。
參考資料:
深刻理解Java的接口和抽象類
Java中的抽象類
方法2:間接引用Coin類中的private變量face(不須要將private改成protected),方法是在Coin類中定義得到face的getFace()
方法 ,改事後的Coin類截圖以下:
flip()
方法。修改以後的MonetaryCoin類的截圖以下:
修改以後的測試代碼截圖以下:
問題3:在實例化pp9.1項目中MonetaryCoin類時出現意料以外的錯誤,截圖以下:
問題3解決方案:仔細檢查以後發現開頭少了public static void main(String[] args) {
,改事後的截圖以下:
錯題1
理解:在Java中,數組被實現爲對象。
錯題2 理解:若是一個int數組做爲參數傳遞給方法,
int[] a
可爲方法頭定義參數列表
錯題3 理解:語句保留了1000個引用變量的內存空間。注意,1000個BankAccount對象都沒有實例化。
錯題4 錯因:不熟悉數組的定義方法的細節
關於數組的一些知識: int []a,b;
是聲明瞭a和b兩個整數型數組;int a,b[];
是聲明瞭一個整數型變量a和一個整數型數組b;int []a;
和int a[]
是等價的,都是聲明一個整型數組a。
int[]a =new int[10]
這條語句是對整數型數組a進行了實例化;給數組中每一個索引處賦值叫作對數組進行初始化。
錯題5 理解: 直接將數組a變爲數組b,也就是直接創造了一個新的數組,而不是複製。
錯題6 理解:C項的意思爲:初始化列表有4個int值,初始化意味着賦值。
錯題7 理解:在java命令以後,在命令行輸入的任何內容都將被接受爲命令行參數。Java主方法使用參數(String[]變量),以便用戶能夠運行程序並提供「命令行」參數。因爲參數是一個字符串數組,所以用戶沒必要提供任何參數。
錯題8 理解:只要只訪問ArrayList的元素,它的效率與數組的效率差很少。只有當一我的開始在ArrayList的前部分插入或移除元素時,它的效率纔會惡化。ArrayList是做爲數組實現的,只要其中一個只是訪問ArrayList的元素,效率與數組的效率是同樣的。可是,當對ArrayList的前部分進行插入或刪除時,就會發生大量的元素複製,從而下降其效率。
結對學習內容 這周依舊沒有一塊兒討論什麼問題......多是時機未到吧!
繼續堅持堅持堅持吧!
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 28/28 | 1/1 | 16/16 | |
第二週 | 710/738 | 1/2 | 20/36 | |
第三週 | 426/1164 | 1/3 | 16/52 | |
第四周 | 1068/2232 | 2/5 | 20/72 | |
第五週 | 604/2928 | 1/6 | 22/94 | |
第六週 | 609/3537 | 1/7 | 22/116 | |
第七週 | 599/4136 | 1/8 | 18/134 |
計劃學習時間:20小時
實際學習時間:18小時
改進狀況:堅持到底!