20145301第四周學習總結
教材學習內容總結
第六章
6.1 何謂繼承
-
何謂繼承 面向對象中,子類繼承父類,避免重復的行為定義,不過並非為了避免重復定義行為就使用繼承,濫用繼承而導致程序維護上的問題時有所聞。如何正確判斷使用繼承的時機,以及繼承之后如何活用多態,是學習繼承時的重點。:
-
通過extends繼承的父類可以是不加abstract關鍵字的普通類,也可以是加了abstract關鍵字的抽象類。繼承普通類時可以覆寫父類的方法,或者創建自己獨有的方法,或者這兩者都不使用。繼承抽象類時,必須覆寫抽象類中的全部抽象方法
public class SwordsMan extends Role{
private int level; // 角色等級
private String name; // 角色名稱
private int blood; // 角色血量
public void fight() {
System.out.println("揮劍攻擊");
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
-
implements繼承的父類是且必須是一個interface定義的接口類,且接口中不能定義方法體,只能擁有私有變量和方法名。子類必須實現所有接口中的方法
-
如果一個方法中含有與成員變量同名的局部變量,則方法中對該變量的訪問以局部變量進行訪問,也就是說,方法體中的局部變量覆蓋了成員變量。如果要在該范圍內訪問成員變量,就必須使用this關鍵字
-
不能在靜態上下文和靜態代碼塊中使用this關鍵字,編譯器不允許這么做。
-
子類可以重寫父類的方法,或者說可以覆蓋父類的方法,只要在子類中定義與父類相同的方法就可以了。但是,方法的聲明一定要和父類的方法聲明一樣
- 可以使用super關鍵字應用父類的方法,然后再添加新的業務代碼。
6.2繼承語法細節
-
protected 被聲明為 protected 的成員,相同包中的類可以直接存取,不同包中的類可以在繼承后的子類直接存取;Java中,有3個權限關鍵字,但實際上有4個權限范圍,因為沒有定義權限關鍵字,默認就是包范圍。
-
重新定義的細節 要注意,對於父類中的方法權限,只能擴大但不能縮小(即若原來成員為 public,則子類中重新定義時不可為 private 或 protected);在 Java中,如果想取得父類中的方法定義。可以在調用方法前,加上 super 關鍵字; static 方法屬於類擁有,如果子類中定義了相同簽署的 static 成員,該成員屬於子類所有,而非重新定義, static 方法也沒有多態。
-
對象類型轉換和多態
1.多態:同一個實體同時具有多種形式,這樣可以提高代碼的可重用性
2.對象類型轉換分為向上轉型和向下轉型
向上轉型:子類的對象被看做父類的對象來使用
這樣的類型轉換是安全的,但會丟失子類中新定義的那些信息
向下轉型:父類的對象被看做子類的對象來使用(需要使用強制轉換)
這種類型轉換時不安全的,有可能造成信息的缺失
3.Java中通過覆寫機制可以在繼承關系的若干類中定義方法名、參數表、返回值相同但方法體不同的方法,在程序運行時,根據所引用對象的類型來判斷執行哪個方法,這稱為動態綁定(即運行時確定執行哪個方法)
- 關鍵詞final
1.final可以用於修飾變量、方法和類,表示被修飾的東西只能做一次初始化,之后不能發生改變
當final修飾方法參變量時,表示方法中不會對參變量的值做修改
final修飾的靜態成員變量必須在聲明時或在靜態初始化塊中初始化
final修飾的方法在繼承過程中不能被覆寫
final修飾的類不能被其他類繼承
2.final類沒有子類,final類的成員方法不會被覆寫,final類的成員變量卻不一定是常變量象。
- 關於垃圾收集 JVM 有垃圾收集(GC)機制,執行流程(目前我們只接觸過 main()程序進入點開始之后的主流程)中,無法通過變量參考的對象(就是沒有牌子的對象),就是 GC 認定的垃圾對象。數。
第七章
7.1 何謂接口
-
定義形式:interface interfaceName {…}
成員方法默認為抽象的、公有的,成員屬性默認為靜態的、final修飾的
接口只是提供一種形式,具體的實現細節交由它的類完成
由於接口不涉及具體的實現,因此在接口中的成員變量是靜態常變量,默認為static和final修飾
-
類實現一個接口:class MyClass implements A, B, C {…}
一個類可以實現多各個接口
注意:雖然在接口中沒有顯式聲明方法是公有的,但接口中默認的訪問控制是公有的,而類中默認的訪問控制是包內友好,所以必須在類中將這個方法用public修飾
-
接口和抽象類的選擇:
Java中類之間不支持多繼承,但類可以實現多個接口
若類需要包含一些方法的實現,必須實現為抽象類,其他情況兩者皆可,優先選擇使用接口,使程序更加易於擴展
7.2 接口語法細節
- 使用interface來定義抽象的行為外觀,方法要聲明為public abstract,無須且不能有操作。為了方便,也可以省略public abstract,編譯程序會協助補齊。可以使用接口枚舉常數,只能定義為public static final。為了方便,也可以省略public static final。
- 接口可以繼承別的接口,也可以同時繼承兩個以上的接口,也是使用extends關鍵字。
- enum語法可用於定義枚舉常數,enum實際上定義了類,而enum中列舉的常數實際上是public static final,無法撰寫程序直接實例化枚舉類型,因為構造函數權限設定為private,只有類中才可以實例化。
問題和解決過程
問題
不清楚覆蓋和重載。
解決過程
在博客園上找到高手之見,特推薦:
重載和覆蓋的區別:
- 重載發生在同一個類之中,重載要求函數名相同,參數不同(參數個數||參數類型||參數順序)。特別的函數的返回類型不影響重載。
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
- 覆蓋發生在父子類之間,覆蓋同樣要求函數名相同,並且參數也相同。覆蓋遵循“兩同兩小一大”的原則。 兩同是即是函數名和參數是相同的;兩小是拋出的異常更小或相同,返回類型更小或相同;一大是訪問權限更大或相同。 構造函數和靜態方法支持重載,但是不可以被覆蓋。(構造方法和static的相似性,也可以聯系到private和final關鍵字也有此相似性)
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
2、不能通過訪問權限、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
其他
- 抽象類和接口的區別:
在設計理念上,一個類只能繼承一個抽象類,但是可以實現多個接口。
抽象類可以含有普通成員變量和非抽象的方法,而接口的成員變量和方法都有固定的修飾。即:public static final 和 public abstract。對於繼承者來說,抽象類的方法子類可以不全部復寫,但是接口的方法抽象類是必須全部復寫的。
抽象類也可以implements接口,可以實現接口中的方法,也可以不實現。抽象類不可以被final修飾。抽象類可以包含非抽象方法。心得體會
這周感覺學習比較吃力,抽象的東西越來越多,理解上難度也逐漸增加。如:對象、封裝等概念,即使讀了,也不能完全理解。也不能再吃C語言的老本,需要我投入更多的時間和精力,我需要更多的去展開去學習,不能僅僅局限在看書,碼代碼上,不懂的地方,我會先碼着碼,好先留存着問題,去與同學進行交流。我發現博客園的學習不應僅僅局限於dky的小圈子,我們可以抽些時間,看看其他高手的博客進行學習,會對我們的學習很有幫助。
學習進度條
目標 | 代碼行數 | 博客量 | 學習時間 | 重要成長 |
---|---|---|---|---|
目標 | 4000行 | 30篇 | 400小時 | ---- |
第一周 | 100/4000 | 2/30 | 15/400 | hello java |
第二周 | 350/4000 | 3/30 | 40/400 | 流程控制 |
第三周 | 500/4000 | 4/30 | 50/400 | 類與對象、封裝 |
第四周 | 700/4000 | 5/30 | 50/400 | 繼承、接口 |
參考資料
- 《Java學習筆記》
- 《Java學習筆記》學習指導
- 畢向東java教學