類的繼承知識點
(1)java不支持多重繼承,也就是說子類至多隻能有一個父類
(2)子類繼承了其父類中不是私有的成員變量和成員方法,做爲本身的成員變量和方法
(3)子類中定義的成員變量和父類中定義的成員變量相同時,則父類中的成員變量不能被繼承
(4)子類中定義的成員方法,而且這個成員方法的名字,返回類型,及參數個數和類型與父類的某個成員方法徹底相同,則父類的成員方法不能被繼承。html
jvm的執行過程
(1)子類B 的構造方法被調用,實例化一個B對象,B對象的成員被初始化
(2)jvm隱含的調用父類的構造方法,實例化一個A對象,A對象的成員被初始化。
(3)因爲A對象的printI()未被屏蔽,因此調用的A對象的printI()函數。
那麼,在這裏A的成員函數固然是訪問本身的成員變量了。java
super關鍵字
super關鍵字在java中的做用是使被屏蔽的成員變量或者成員方法或變爲可見,或者說用來引用被屏蔽的成員變量和成員成員方法。super是用在子類中,目的是訪問直接父類中被屏蔽的成員。git
interface Printable { final int MAX=100; void add(); float sum(float x,float y); }
問題1:看到p115時,不由想到java中若是建立一個子類的對象,那麼父類的對象是否被建立了?編程
問題1解決方案:經過查找資料,發現:不會,按理來講,子類繼承父類的話,構造方法父類先執行,那麼這個執行應該只是代碼上的,對象的話應該是沒有建立的。多態其中一條很明顯的道理,父類引用指向子類對象。那麼這個引用的話,應該只是代碼上的引用。
jvm
super
和this
有什麼不一樣?問題2解決方案:其實super.不是「東西」,說道super.天然會想到this.,有人把他們歸爲同類,其實他們大大不一樣
- this:是一個真真實實對象,表明的就是當前對象,能夠用 return this; 去返回一個對象。
- super:不能一個對象,不是指向父類對象的意思,super只是修飾了他後邊的內容,告訴JVM,後面這部份內容不是當前對象所屬類的內容而已,若用return super,JVM是不容許的,是一種錯誤的語法。函數
public static void main(String args[]) { Chilren b = new chilren(); Father c = b System.out.println(b.age); System.out.println(c.age); } 輸出 18 40
學習
看到上面這段代碼,這裏並非說內存中有兩個對象 b 和 c ,內存中其實就只有一個 b對象 ,只是c 不只有本身的實例 變量,同時也存在父類所定義的所有實例變量。this
因此能夠得出結論:`在實例化一個子類的同時,系統會給子類全部實例變量分配內存,也會給他的父類的實例變量分配內存,及時父子類中存在重名的實例變量,也會兩個都分配內存的,這個時候子類只是隱藏了父類的這個變量,但仍是會給它分配內存,而後能夠用super來訪問屬於父類的變量。`
這是java多態性的表現,要深刻理解的話得從內存方面去思考,建立的是子類對象,可是指針類型是父類的,它能指向的內存塊是父類應能對應的內容。當你把A類得Area()方法刪除時,a指向的內存塊裏沒有Area方法,或者說它指向的這個對象雖然有這個方法,可是這個指針倒是無法去訪問該方法的, 因此出現沒法訪問的狀況。
若是子類以下定義computer方法,是否屬於重寫繼承的computer方法的
經過編譯運行,結果是17.0 20
爲何不屬於重寫computer方法,編譯無錯誤呢?設計
錯誤: 找不到或沒法加載主類 Example5_2
float computer (float x,float y,double z) { return x-y; }
改爲指針
float computer (float x,float y) { return x*y; }
float resultOne = aver.f(); float resultTwo = aver.g();
再進行編譯運行,結果正確。
注:當super調用被隱藏的方法時,該方法中出現的成員變量時被子類隱藏的成員變量或繼承的成員變量
問題4解決方案:經過編譯Application.java
這個文件,再java Application
,結果成功運行
問題5:運行第五章課後習題時出現以下圖所示問題
問題5解決方案:認真校對代碼後發現將println
拼寫成了pritnln
,更改事後順利運行
表達式0xaa|0x55的值
表達式-2>>>1的值
>>>
和>>
>>>
是無符號右移,即不管正負數,右移以後符號位均補0,-2的二進制無符號右移一位以後爲0111 1111 1111 1111 1111 1111 1111 1111,即2^31-1。下列與3*4的值相等的是
^
在Java中表示亦或。觀察下列方法的定義,則該方法的返回類型爲 ReturnType method(byte x, double y) { return (short)x/y*2; }
short和Float都屬於基本數據類型。
「字符類型」中的「字符」指Unicode表中的一個字符。
結對照片
經過這周的考試,發現本身有不少地方不足,特別是在編程這種實踐型的操做的時候,顯得無從下手,有些無力,其實理論知識和動手操做是兩碼事,平時應該多動手編程,而不只僅只是敲書上的代碼
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第四周 | 1105/1300 | 1/2 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:30小時
實際學習時間:18小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)