20155305喬磊2016-2017-2《Java程序設計》第四周學習總結
教材學習內容總結
繼承
- 繼承就是避免多個類間重復定義共同行為。
- 面向對象中,子類繼承父類,就是把程序中相同的代碼部分提升為父類。
extends
關鍵字,表示前者會擴充后者的行為,即繼承后者的行為。fight()為SwordsMan擴充的Role沒有的行為。private
成員也會被繼承,不過子類無法直接存取,必須通過父類提供的方法存取。
is-a(是一種)關系
- 子類只能繼承一個父類,這種子類父類之間的關系就是
is-a
關系。 - 檢查語法邏輯是否正確,方式是從
=
右邊往左讀:判斷右邊是不是一種左邊。例:Role role1=new SwordsMan();
即判斷SwordsMan
是不是一種Role
?若是則語法正確,反之則編譯失敗。 - 強制讓后者是一種前者:
Role role1=new SwordsMan();SwordsMan swordsman=(SwordsMan) role1;
多態
- 使用單一接口操作多種類型的對象,具有更高的可維護性。
Java
以繼承及界面來實現多態,是次態多態的一種實現。public class RPG2{public static void main (String[] args){SwordsMan swordsMan = new SwordsMan();swordsMan.setName("Justin");swordsMan.setLevel(1);swordsMan.setBlood(200);Magician magician = new Magician();magician.setName("Moinca");magician.setLevel(1);magician.setBlood(100);showBlood(swordsMan); //SwordsMan是一種RoleshowBlood(magician);}static void showBlood(Role role) //聲明為Role類型{System.out.printf("%s 血量 %d%n",role.getName(), role.getBlood());}}
重新定義行為
- SwordsMan與Magician的fight()方法簽署的都是public void fight(),操作接口相同,只是方法操作內容不同,因此,可以將fight()方法提升至Role類中定義。
- 如果傳入drawFight()的是SwordsMan,role參數參考的就是SwordsMan實例,操作的就是SwordsMan上的fight()方法定義。
- 重新定義父類中某個方法時,子類必須撰寫與父類方法中相同的簽署。可以在子類中某個方法前使用
@Override
要求編譯程序檢查該方法是不是真的重新定義了父類中某個方法,如果不是會引發編譯錯誤。 - 對于父類中的方法權限,只能擴大不能縮小。
抽象方法 抽象類
- 抽象方法:某方法區塊中沒有任何程序代碼操作,用
abstract
表示該方法為抽象方法,不用撰寫{}區塊,直接";"結束即可。 - 抽象類:內含抽象方法的類,一定要在
class
前標示abstract
,表示類定義不完整,不能用來生成實例。
protected
- 被聲明為
protected
的成員,相同包中的類可以直接存取,不同包中的類可以在繼承后的子類直接存取。 - private、無關鍵字、protected、public權限依次遞增。
構造函數
- 類有繼承關系時,會先進行父類定義的初始流程,再進行子類定義的初始流程。
- 父類中可以重載多個構造函數,如果子類構造函數中沒有制定執行父類中哪個構造函數,默認會調用父類中無參數構造函數。
this()
和super()
只能擇一調用,并且要寫在構造函數第一行執行。
final關鍵字
- class或方法被聲明為final,表示這是最后一個,不會再有子類或子類不可以重新定義方法。
java.lang.Object
java.lang.Object
是最上層父類,Java中所有對象一定是一種Object。
接口的默認
- Java中可以使用interface來定義抽象的行為和外觀。
- 接口中的方法沒有操作時一定得是公開且抽象的。
- 接口可以繼承別的接口,也可以同時繼承兩個以上的接口,同樣也是用
extends
關鍵字,這代表了繼承父接口的行為。
匿名內部類
- 臨時繼承某個類或操作某個接口并建立實例,由于這類子類或接口操作類只使用一次,不需要為這些類定義名稱,可以使用匿名內部類。
教材學習中的問題和解決過程
- 問題:本來像書上p167中的
fight()
方法運行都沒有問題,但是按照書上p169抽象方法與抽象類中,將前面的Role.java
中的fight()
方法改成如下的格式public abstract void fight();
之后,RPG.java
就運行不了了。 - 解決方法:待解決。
代碼調試中的問題和解決過程
- 問題:Guest訪客名稱,訪客名單在run的時候出現了問題
后來在run edit中發現自己把各項都改成了Guest - 解決方法:把run edit中各項改了
運行結果正確
代碼托管
上周考試錯題總結
- 填空:Linux Bash中,(grep )命令可以進行全文搜索。
- 填空:System.out.println(“”+52+25);的結果是(5225)
- 填空:System.out.println(52+25+””);的結果是(77)
- 填空:p86 命令行下編譯Guess.java的命令是(javac -d . Guess.java)
- 填空:兩個Integer對象比較大小,可以使用(comareTo())方法
上網查Interger對象的比較方法寫的是ValueOf()。老師答案是comareTo()。不太理解。
- 填空:“30”轉化為byte類型的30的語句是(Byte.parseByte(“30”);)。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 3000行 | 20篇 | 400小時 | |
第一周 | 200/200 | 1/1 | 18/18 | |
第二周 | 153/353 | 1/2 | 18/36 | |
第三周 | 356/709 | 1/3 | 24/60 | |
第四周 | 450/1259 | 1/4 | 28/85 |
參考:軟件工程軟件的估計為什么這么難,軟件工程 估計方法
計劃學習時間:30小時
實際學習時間:28小時
改進情況:計劃學習時間由于上周沒有達成,所以這周仍然定為30小時,學習時間有所提高。
有空多看看現代軟件工程 課件 軟件工程師能力自我評價表
參考資料
Java學習筆記(第8版)
《Java學習筆記(第8版)》學習指導