繼承:
關鍵字:extends
格式:
類A extends 類B
類A為父類 類B為子類
功用:
讓類之間產生關係===》》多型
提高程式碼的複用性
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
注意:
切勿濫用繼承,必須有所屬關係
簡單程式碼舉例:
1 class C 2 { 3 void demo1(){} 4 } 5 6 class B extends C 7 { 8 void demo2(){} 9 //void demo1(){} B和A不必作此宣告 10 } 11 12 class A extends C 13 { 14 //void demo1(){} 15 void demo3(){} 16 }
A,B繼承C的成員demo1()
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
java語言只支援單繼承,不支援多繼承(即一個類可以同時繼承多個類)
功用:提高了程式碼的安全性,當多個父類中有相同的屬性,子類呼叫執行哪個成為問題
簡單程式碼舉例:
1 class C 2 { 3 void show() 4 { 5 System.out.println("C");l 6 } 7 } 8 class B 9 { 10 void show() 11 { 12 System.out.println("B"); 13 } 14 } 15 class A extens B,C 16 { 17 A a = new A(); 18 a.show(); //A該執行哪個show()? 19 }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
java語言支援多層繼承即A extends B, C extends A,
則C中同時具有A和B中的所有屬性,是一個繼承體系。
在具體呼叫的時候建立子類物件,
父類可能不能建立物件,而子類中還有特有的屬性
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
覆蓋(重寫,成員函式具有的特性)
概念:子類中的方法與父類中相同(型別,名稱,引數,返回值),保留父類的功能定義
改變父類的功能內容
注意:
子類的許可權必須大於父類的許可權,才能覆蓋
靜態的方法只能覆蓋靜態的方法
重寫可用於擴充套件:(簡單程式碼)
1 class A 2 { 3 void show() 4 { 5 System.out.println("A"); 6 } 7 } 8 9 class B extends A 10 { 11 void show() 12 { 13 super.show(); 14 System.out.println("B"); 15 } 16 }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
子父類的建構函式
在子類例項化時,子類的建構函式預設會呼叫父類的建構函式
子類必須瞭解父類對物件初始化做了什麼,因此在生成物件的時候子類必須先呼叫父類的構造方法,然後再呼叫自己的構造方法
簡單程式碼:
1 class A 2 { 3 A() 4 { 5 System.out.println("a"); 6 } 7 } 8 9 class B extends A 10 { 11 B() 12 { 13 super(); //此處是虛擬機器預設新增 14 System.out.println("b"); 15 } 16 }
注意:
假如類B的定義如下:此時B中的構造方法B()不再訪問父類構造方法,
即this與super只能存在一個
1 class A 2 { 3 A() 4 { 5 System.out.println("a"); 6 } 7 8 } 9 class B extends A 10 { 11 B() 12 { 13 this(3); 14 System.out.println("b"); 15 } 16 B(int num) 17 { 18 //super(); 19 System.out.println("B"+" "+num); 20 } 21 22 public static void main(String[] args) 23 { 24 B b = new B(); 25 } 26 }
輸出結果:
a
B 3
b
即因為B中有this則B不再呼叫父類構造方法
而是在呼叫B(int num)這個構造方法來呼叫父類的呼叫方法
否則輸出結果為
a
B 3
a
b
結論:子類物件例項化時必然要呼叫父類的構造方法
注意:
若A中沒有空引數列表建構函式,則此時在子類B的構造方法中必須顯示的呼叫A的構造方法
否則編譯錯誤