1. 程式人生 > >第4周學習總結

第4周學習總結

先後 無符號 result 博客 abstract com 得出 學習總結 -m

20165226 2017-2018-3 《Java程序設計》第4周學習總結

教材學習內容總結

第五章 子類與父類

  • 類的繼承知識點
    (1)java不支持多重繼承,也就是說子類至多只能有一個父類
    (2)子類繼承了其父類中不是私有的成員變量和成員方法,作為自己的成員變量和方法
    (3)子類中定義的成員變量和父類中定義的成員變量相同時,則父類中的成員變量不能被繼承
    (4)子類中定義的成員方法,並且這個成員方法的名字,返回類型,及參數個數和類型與父類的某個成員方法完全相同,則父類的成員方法不能被繼承。

  • jvm的執行過程
    (1)子類B 的構造方法被調用,實例化一個B對象,B對象的成員被初始化
    (2)jvm隱含的調用父類的構造方法,實例化一個A對象,A對象的成員被初始化。
    (3)由於A對象的printI()未被屏蔽,所以調用的A對象的printI()函數。
    那麽,在這裏A的成員函數當然是訪問自己的成員變量了。

  • super關鍵字
    super關鍵字在java中的作用是使被屏蔽的成員變量或者成員方法或變為可見,或者說用來引用被屏蔽的成員變量和成員成員方法。super是用在子類中,目的是訪問直接父類中被屏蔽的成員。

第六章 接口與實現

  • 使用關鍵字interface來定義一個接口
interface Printable {
   final int MAX=100;
   void add();
   float sum(float x,float y);
}
  • 接口表示方法
    • 圓形表示法
    • 構造型表示法

技術分享圖片

  • 一個類中需要在類聲明中使用關鍵字implements聲明該類實現一個或多個接口。如果實現多個需要用逗號
    隔開接口名。
  • 實現關系的UML圖

技術分享圖片

  • abstract類vs接口
    • 都可以有abstract方法。
    • 接口只能有常量,不能有變量;abstract類有既有常量又有變量。
    • abstract類也可以有非abstract類方法,接口不可以。
  • 程序設計後之後,首先應當對接口的修改“關閉”。

教材學習中的問題和解決過程

  • 問題1:看到p115時,不禁想到java中如果創建一個子類的對象,那麽父類的對象是否被創建了?

  • 問題1解決方案:通過查找資料,發現:不會,按理來說,子類繼承父類的話,構造方法父類先執行,那麽這個執行應該只是代碼上的,對象的話應該是沒有創建的。多態其中一條很明顯的道理,父類引用指向子類對象。那麽這個引用的話,應該只是代碼上的引用。

  • 問題2:書上122頁上提到super這個關鍵字,想到上一章提到的this,產生了疑問:superthis有什麽不同?
  • 問題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 不僅有自己的實例 變量,同時也存在父類所定義的全部實例變量。

       所以可以得出結論:`在實例化一個子類的同時,系統會給子類所有實例變量分配內存,也會給他的父類的實例變量分配內存,及時父子類中存在重名的實例變量,也會兩個都分配內存的,這個時候子類只是隱藏了父類的這個變量,但還是會給它分配內存,然後可以用super來訪問屬於父類的變量。`

- 問題3:有些不明白,實際上創建的是子類的實例,為什麽調用的是子類的方法,父類的成員變量?
- 問題3解決方案:通過查找資料,得到以下解釋

這是java多態性的表現,要深入理解的話得從內存方面去思考,創建的是子類對象,但是指針類型是父類的,它能指向的內存塊是父類應能對應的內容。當你把A類得Area()方法刪除時,a指向的內存塊裏沒有Area方法,或者說它指向的這個對象雖然有這個方法,但是這個指針卻是沒法去訪問該方法的, 所以出現無法訪問的情況。

- 問題4:教材121中`如果子類如下定義computer方法,是否屬於重寫繼承的computer方法的`通過編譯運行,結果是

17.0
20

為什麽不屬於重寫computer方法,編譯無錯誤呢?
- 問題4解決方案:子類在重寫可以繼承的方法時,完全可以按照自己的意圖編寫新的方法體,以便體現重寫方法的獨特的行為。

## 代碼調試中的問題和解決過程


- 問題1:編譯之後,運行時,系統出現`錯誤: 找不到或無法加載主類 Example5_2`

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320154945293-45101630.png)


- 問題1解決方案:重新在**src**目錄中編譯了一次,再運行
- 問題2:運行Example5_5.java文件時出現了‘17.0   20‘的結果

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320165826238-1007782844.png)


- 問題2解決方案:將Example5_5.java的子類中程序

float computer (float x,float y,double z) {
return x-y;
}

改成

float computer (float x,float y) {
return x*y;
}

- 問題3:運行書中122例七結果卻如下圖

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320175117334-714611902.png)

- 問題3解決方案:vi了以下代碼,發現其中次序有所顛倒,於是將其改成

float resultOne = aver.f();
float resultTwo = aver.g();
```
再進行編譯運行,結果正確。

註:當super調用被隱藏的方法時,該方法中出現的成員變量時被子類隱藏的成員變量或繼承的成員變量

  • 問題4:運行書上例13時出現了以下狀況

技術分享圖片

  • 問題4解決方案:通過編譯Application.java這個文件,再java Application,結果成功運行

  • 問題5:運行第五章課後習題時出現如下圖所示問題
    技術分享圖片

  • 問題5解決方案:認真校對代碼後發現將println拼寫成了pritnln,更改過後順利運行

    代碼托管

技術分享圖片

上周考試錯題總結

  • 錯題1:表達式0xaa|0x55的值
    - 原因:最後的結果仍應換成十六進制
    - 總結:在運算過程中,應註意進制
  • 錯題2:表達式-2>>>1的值
    - 原因:沒區分>>>>>
    - 總結:>>>是無符號右移,即無論正負數,右移之後符號位均補0,-2的二進制無符號右移一位之後為0111 1111 1111 1111 1111 1111 1111 1111,即2^31-1。
  • 錯題3:下列與3*4的值相等的是
    - 原因:關於運算符的運算先後沒弄清楚
    - 總結:3*4即3左移兩位。^在Java中表示亦或。
  • 錯題4:觀察下列方法的定義,則該方法的返回類型為 ReturnType method(byte x, double y) { return (short)x/y*2; }
    • 原因:在程序中對精度不敏感。
    • 總結:short將byte類型的x強制轉化為short類型,但y的精度更高,所以返回類型為double。
  • 錯題5:short和Float都屬於基本數據類型。
    • 原因:Float是float提供的封裝類,不是基本數據類型。
    • 總結:要看清是大寫還是小寫。
  • 錯題6:“字符類型”中的“字符”指Unicode表中的一個字符。
    • 原因:概念不清楚
    • 總結:應多看書,從書中尋找答案。

結對及互評

  • 博客中值得學習的或問題:
    • 要素全面
    • 很認真細致
    • 排版簡介美觀
  • 代碼中值得學習的或問題:
    • 代碼中文件分類簡潔
    • 很認真

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20165230
    • 結對照片
      技術分享圖片

    • 結對學習內容
      • 學習如何使用jdb,在jdb上進行代碼調試

其他

通過這周的考試,發現自己有很多地方不足,特別是在編程這種實踐型的操作的時候,顯得無從下手,有些無力,其實理論知識和動手操作是兩碼事,平時應該多動手編程,而不僅僅只是敲書上的代碼

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時

| 第四周 | 1105/1300 | 1/2 | 30/90 | |

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:30小時

  • 實際學習時間:18小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • Java學習筆記(第8版)

  • 《Java學習筆記(第8版)》學習指導

第4周學習總結