1. 繼承是物件導向三大特徵之一,也是實現軟體複用的重要手段。
¯ 繼承的特點(關鍵字是extends,extends英文意思是擴充,而不是繼承。但這個關鍵字很好的體現了子類和父類的關係,即子類是父類的繼承,是一種特殊的父類)
µ 通過繼承,在已有類型基礎之上進行擴充或改造,得到新的資料類型。
ü 已有的類型稱為父類、基類或超類。
ü 得到的新資料類型,稱為子類或衍生類別
ü 類的繼承提高了程式碼的重用性和可擴充性,縮短了軟體開發的周期。
2.繼承的分類:
單繼承---------子類只能有一個直接父類
多重繼承------子類可以有多個直接父類
Java不支援多重繼承,不是說java類只能有一個父類,而是說java類只能有一個直接父類,實際上java類可以有無限多個間接父類;is-A表示繼承關係(是一個);has a表示彙總關係(有一個)。Java子類不能直接調用父類的構造方法。
3. 方法重寫時要遵循的規則:“三同一小一大”規則
1).“三同”即方法名相同,形參列表相同,傳回值類型相同;
2).“一小”指的是子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類更小或相等;
3).“一大”指的子類方法的存取權限應比父類方法更大或相等;
4).覆蓋方法和被覆蓋方法要麼都是類方法,要麼都是執行個體方法,不能一個是類方法,一個是執行個體方法。
4. 如果定義一個java類時並未顯示指定這個類的直接父類,則這個類預設擴充java.lang.Object類。Java.lang.Object是所有類的父類,要麼是直接父類,要麼是間接父類。所有java對象都可調用java.lang.Object類所定義的執行個體方法。Object類是類階層的根類。所以一個類可直接調用Object中的方法不用聲明,繼承而來。
子類擴充(extender)了父類;父類派生(derive)出了子類;擴充和派生所描述的是同一個動作,只是觀察角度不同而已。
5. 方法重寫(override)和方法重載(overload)的區別
1).覆蓋是子類和父類之間的關係;而重載是同一類內部多個方法之間的關係。(子類包含與父類同名方法的現象被稱為方法重寫或方法覆蓋。)
2).覆蓋一般是兩個方法間的,而重載可能有多個重載的方法。
3).覆蓋的方法有相同的方法名和形參表;而重載的方法只能有相同的方法名,不能有相同的形參表。
4).覆蓋時根據調用它的對象來區分方法;而重載是根據形參表來決定調用的是哪個方法。
6. 父類執行個體的super引用
當子類方法覆蓋了父類方法後,子類的對象將無法訪問父類中被覆蓋的方法,但仍可以在子類方法中調用父類中被覆蓋的方法;如果需要在子類方法中調用父類被覆蓋的執行個體方法,可以用super作為調用者來調用父類被覆蓋的執行個體方法。
注意:
1).super是Java提供的一個關鍵字,它是直接父類對象的預設引用。
2).正如this不能出現在static修飾的方法中一樣,super也不能出現在static的方法中 ;static修飾的方法屬於類,該方法的調用者可能是一個類,而不是對象,也就不存在對應的父物件,因而super引用也就失去了意思。This、private為對象、執行個體,必須先new對象,後才可以使用。Super();this();只能在構造方法的第一條語句,且兩者不能同時出現(因為都要在第一位);在其他地方則用super.對象名,this.對象名表示。
3).如果子類定義了和父類同名的屬性,也會發生子類屬性覆蓋父類屬性的情形。子類的方法直接存取該屬性時,都會訪問到覆蓋屬性,無法訪問父類被覆蓋的屬性---通過super來訪問父類被覆蓋的屬性
4).如果父類方法具有private存取權限,則該方法對其子類是隱藏的,子類無法訪問該方法,也就無法重寫該方法,這時,即便子類中定義了一個與父類private方法具有相同名稱、相同形參列表、相同傳回值類型的方法,依然不是重寫。但可以利用set、get方法來調用(兩個不同類間的訪問也可以這樣);例如:父類A中有一個private int a;可以做set、get函數來調用,publicvoid seta(int a){this.a = a;} public intgetA(){return this.a;};在子類B中可直接調用setA並為其賦值,B b = new B(); b.setA(10).
7. 如果被覆蓋的是類屬性,在子類的方法中則可以通過父類名調用訪問被覆蓋的類屬性;如果子類裡沒有包含和父類同名的屬性,則子類將直接繼承到父類屬性。如果在子類執行個體中訪問該屬性,則無需使用suoper或父類名作為調用者。
如果我們在某個方法中訪問名為a的屬性,但沒有顯示指定調用者,系統尋找a的順序為:
ü 尋找該方法中是否有名為a的局部變數
ü 尋找當前類中是否包含名為a的屬性
ü 尋找a 的直接父類中是否包含名為a的屬性,依次上溯a的父類,直到java.lang.Object類,如果最終不能找到名為a的屬性,則系統出現編譯錯誤。
8. 子類不會獲得父類的構造方法,但有些時候子類構造方法去需要調用父類構造方法的初始化代碼;在一個構造方法中調用另一個重載的構造的方法,一般使用this來實現,在子類構造方法中調用父類構造方法,一般使用super來實現。
注意:super調用和this調用很像,區別在於super調用的是其父類的構造方法,而this調用的是同一個類中重載的構造方法。因此,使用super調用父類構造也必須出現在子類構造執行體的第一行,所以this調用和super調用不會同時出現。
9. 管是否使用super調用來執行父類構造方法的初始化代碼,子類構造方法總會調用父類的構造方法一次。
子類構造方法調用父類構造方法分如下幾種情況:
µ 子類構造方法執行體的第一行代碼使用super顯示調用父類構造方法,系統將根據super調用裡傳入的實參列表調用父類對應的構造方法。
µ 子類構造方法執行體的第一行代碼使用this顯示調用本類中重載的構造方法,系統將根據this調用裡傳入的實參列表調用本類另一個構造方法。執行本類中另一個構造方法時即會調用父類的構造方法。
µ 子類構造方法執行體中既沒有super調用,也沒有this調用,系統將會在執行子類構造方法之前,隱式調用父類無參數的構造方法。
不管上面哪種情況,當調用父類構造方法來初始化子類對象時,父類構造方法總會在子類構造方法之前執行。
注意:當通過子類構造方法建立子類對象時,預設的先執行父類不含參數的構造方法,再執行子類類構造方法。
10. 多態性是指一個同名方法可能有多種版本在程式中同時存在,使用者使用同一個方法名調用方法,系統會根據具體情況調用方法的不同不版本,從而實現不同的功能,及實現“一個介面,多個方法”。
多態性允許以統一的風格處理已存在的變數及相關的類,使得向系統增加新功能變得容易,繼承性和多態性是降低軟體複雜性的有效技術;多態性技術主要表現在方法重載和方法覆蓋兩個方面。繼承下來的許可權不發生變化。