關於繼承的一些小總結

風痕影默發表於2014-02-28

繼承:
關鍵字: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 }
View Code

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 }
View Code

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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 }
View Code

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
子父類的建構函式
  在子類例項化時,子類的建構函式預設會呼叫父類的建構函式
  子類必須瞭解父類對物件初始化做了什麼,因此在生成物件的時候子類必須先呼叫父類的構造方法,然後再呼叫自己的構造方法
簡單程式碼:

 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 }
View Code

注意:
  假如類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 }
View Code

輸出結果:
    a
    B 3
    b
  即因為B中有this則B不再呼叫父類構造方法
  而是在呼叫B(int num)這個構造方法來呼叫父類的呼叫方法
否則輸出結果為
    a
    B 3
    a
    b
結論:子類物件例項化時必然要呼叫父類的構造方法
注意:
  若A中沒有空引數列表建構函式,則此時在子類B的構造方法中必須顯示的呼叫A的構造方法
  否則編譯錯誤

相關文章