# 20175316盛茂淞 2018-2019-2《Java程序設計》第4周學習總結
20175316盛茂淞 2018-2019-2《Java程序設計》第4周學習總結
教材學習內容總結
第五章 子類與繼承
一.繼承
- 1.繼承定義:避免多個類間重復定義共同行為
- 2.子類與父類:
- 父類:
- 對有著 共同特性 的多類事物,進行再 抽象 成一個類,這個類就是多類事物的父類
- 父類的意義在於可以抽取多類事物的共性
- 子類既可以是一個子類,也可以是一個父類;父類既可以是一個父類,也可以是一個子類
- 在Java中只有 單一繼承 ,即 子類只能繼承一個父類
- 子類與父類間會有 is-a 的關系( 子類 is a 父類 )
public class RPG1 { public static void main(String[] args) { demoSwordsMan1(); demoMagician1(); } static void demoSwordsMan1() { SwordsMan1 swordsMan1 = new SwordsMan1(); swordsMan1.setName("Justin"); swordsMan1.setLevel(1); swordsMan1.setBlood(200); System.out.printf("劍士:(%s,%d,%d)%n",swordsMan1.getName(),swordsMan1.getLevel(),swordsMan1.getBlood()); } static void demoMagician1() { Magician1 magician1 = new Magician1(); magician1.setName("Monica"); magician1.setLevel(1); magician1.setBlood(100); System.out.printf("魔法師:(%s,%d,%d)%n",magician1.getName(),magician1.getLevel(),magician1.getBlood()); } }
- 父類:
- 3.多態與is-a
- IS-A譯為“是一種”,子類與父類就是一種“IS-A”的關系。例如上述代碼,SwordsMan是一種Role(即SwordsMan is a Role)。
- 註意建立對象時候的順序,應該遵守從右往左讀的原則(這樣才符合IS-A原則):
SwordsMan swordsman=new SwordsMan;
Role role=new SwordsMan();
- 在java中有且僅有一種繼承父類
- 賦值時:如果用父類建立了一個對象實例,那麽要將這個對象賦給它的子類時,需要進行強制轉eg:
Role role1 = new SwordsMan(); SowrdsMan swordsMan = (SwordsMan) role1;
4.重新定義行為
如果子類和父類的定義函數名相同會出現函數覆蓋的情況。
多個類中功能相同但是功能主體不同,也可以抽取在父類中。5.抽象方法、抽象類
上述在父類中的fight()函數沒有撰寫程序代碼,用abstract關鍵詞標識,public abstract class roleplay
表示定義不完整的類,就不能建立實例。
子類必須覆蓋父類中的所有抽象方法,才能建立子類調用。6.protected成員
protected與public、private類似都是權限關鍵字。如果成員被定義為protected的話在相同的包中可以直接存取。7.super關鍵字
修改子類中已經存在的內容時,可以在調用方法前加上super關鍵字。註意
(1)關鍵字extends是為了擴充和繼承父類的行為。
(2)在java中一個子類只能繼承一個父類。
(3)在判斷操作對象是“哪一種”的時候,檢查語法的邏輯是否正確,方式是從=右邊往左邊讀:右邊是不是一種左邊呢(右邊類是不是左邊類的子類)?
(4)在重新定義中,子類必須撰寫與父類方法相同的簽署,如果因為疏忽打錯字就會完全不同(雖然編譯會成功,但是行為會完全不同),但在JDK5後
(5)標註@Override,表示要求編譯程序檢查是否真的重新定義父類中某個方法。
(6)子類如果繼承抽象類,對於抽象方法有兩種做法,一種是繼續標註該方法為abstract(必須在class前標註abstract),另一種就是操作抽象方法,如果都沒有實施,則會出現編譯錯誤。
教材學習中的問題和解決過程
- 問題一:
關於子類繼承抽象類有些不太清楚,課本上說繼續標識子類是一種抽象類或者說操作抽象方法。關於如何操作抽象方法小小的做了一個嘗試:
abstract class role{
abstract void speak();
}
class student extends role {
void speak(){
System.out.println("i am just a student");
}
}
public class abvoid {
public static void main(String[] args) {
student stu1=new student();
stu1.speak();
// TODO code application logic here
}
}
- 結果
調試與運行截圖
- 編譯
- 上傳碼雲
上周考試錯題情況
- 題目1
在Ubuntu中用自己的有位學號建一個文件,教材p87 Example4_15
1. 修改代碼中的stu的number為自己學號的後四位,package那一行改為你的姓名首字母縮寫,比如劉德華同學改為package ldh
2. 其他需要修改的自行修改,提交運行結果截圖
- 出現問題:編譯不成功:找不到或無法加載主類項
- 解決辦法:
註意編譯命令為 javac sms(文件夾)/ Example4_15.java
運行命令 java sms/ Example4_15 運行截圖
- 題目2
參考http://www.cnblogs.com/rocedu/p/6766748.html 編程實現輸入平方倒置的功能
命令行傳入數組,比如類名為ArraySquareReverse, java ArraySquareReverse 1 2 3 4 輸出16 9 4 1
提交運行結果的截圖(至少五張),註意測試正常,異常,邊界情況,輸入參數最後一個是你的學號後2位
- 出現問題:類名必須和文件名一樣
- 編譯運行結果
(1)例子
(2)參數最後一個是我的學號後2位 16
(3)參數有一個是0
(4)參數有負數 - 運行結果
(1)
(2)
(3)
(4)
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
本周學習感受
本周測試題目二較難,需要用到各種結構體和數組,難度較大,我是在上網查閱資料後才編寫出來,仍需多加練習。
這兩周的學習內容中有很多的概念,書上的例子也有很多需要我們去實踐,雖然說課本上的代碼也敲了,知識內容都理解了,但是感覺學的還是不踏實,對於java面向對象這一塊還是不能很好的應用。只能說學的多而不精,看上去每個概念都學了,但是應用方面有很大的欠缺。希望以後自己慢慢地實踐過程中再學習體會吧。
我慢慢的感覺學習Java已經變成了每天的一項日常,會不知不覺的在空閑的時候學習一會Java,慢慢的也體會到了Java的樂趣,我相信我會帶著這種樂趣一直堅持下去
# 20175316盛茂淞 2018-2019-2《Java程序設計》第4周學習總結