1. 程式人生 > >抽象類與抽象函式

抽象類與抽象函式

1、概念

(1)抽象函式:只有函式定義,沒有函式體的函式。例如:

abstract void fun()

(2)抽象類(基類):使用abstract定義的類稱之為抽象類。記住:抽象類天生就是當爹的,要被繼承!

2、使用說明

(1)抽象類不能生成物件(假設可以生成物件,那麼可以呼叫裡面的抽象函式,而抽象類中若是有一個抽象 函式,其函式體為空,這樣便毫無意義);
(2)如果一個抽象類中含有一個抽象函式,那麼這個類必須宣告為抽象類;
(3)如果一個抽象類中沒有抽象函式,那麼這個類也可以宣告為抽象類(當不想讓其生成物件時,將其定義為抽象類即可)。

注意:抽象關鍵字不能和關鍵字final、private、static共存

  • final:final修飾的類不能被繼承,而抽象類必須被繼承;
  • private: 抽象父類中有private修飾的某抽象方法,繼承的子類中無法覆蓋該方法,而抽象類必須由其子類覆蓋掉所有的抽象方法後,其子類才可以進行例項化,否則,該子類還是一個抽象類。
  • static: 抽象父類中有static修飾的某抽象方法,便可以通過“類名.該抽象方法”呼叫父類中的抽象方法,而呼叫抽象方法沒有意義!

【例1】抽象類的使用例項。

package com.chouxiang;
//定義一個抽象類
public abstract class Person {
    String name;
    int
age; Person(){ System.out.println("我是父類Person的建構函式"); } //定義一個抽象方法 abstract void eat(); } package com.chouxiang; /*子類繼承了父類的屬性與方法,當然包括父類的抽象函式。 * 故而Chinese類應該為抽象類,應該在其前面加上abstract,這時子類不可以例項化。 */ public class Chinese extends Person{ Chinese(){ System.out.println("我是子類Chinese的建構函式"
); } //使用覆蓋的方式,在子類中複寫父類的抽象函式,這時就可以將子類變成非抽象類,子類便可以生成物件 void eat(){ System.out.println("用筷子吃飯!"); } } package com.chouxiang; public class Test { public static void main(String[] args) { Person p=new Chinese(); p.eat(); } }

執行結果:
這裡寫圖片描述
結果分析:
  通過執行結果可知,抽象類是可以有建構函式的!理論上,建構函式一般用於生成物件,而抽象類是不能生成物件的,所以,抽象類貌似不可以有建構函式。其實,我們忽略了一個重要的資訊,那就是,非抽象類子類繼承了抽象父類,非抽象子類中顯然可以有建構函式。呼叫子類的建構函式前必須前呼叫父類中建構函式,所以,抽象父類是可以有建構函式的!

3、抽象類的作用

  在實際開發過程中,例如以上的程式碼,父類是一個抽象類,子類繼承了父類,父類中有一個抽象函式。如不想子類稱為抽象類,必須在子類中複寫父類中的抽象函式,否則,編譯將出錯,這樣可以防止我們在後期開發中出錯。

4、一般類和抽象類的異同

(1)相同之處:
  一般類和抽象類都用於描述事物。
  裡面都可以定義屬性和行為,以及建構函式。
(2)不同之處:
  一般類中不可以定義抽象函式,抽象類可以。
  一般類可以被例項化,抽象類不行。
  一般類可以被繼承,也可以不被繼承,
  抽象類一定要被繼承,需要其子類覆蓋所有的抽象方法子類才可以被例項化。