Java關鍵字之abstract(抽象類的概念和使用)

eff666發表於2016-08-26

1、概述
(1)只給出方法定義而不具體實現的方法被稱為抽象方法,抽象方法是沒有方法體的,在程式碼的表達上就是沒有“{}”。使用 abstract 修飾符來表示抽象方法和抽象類。
(2)abstract修飾符表示所修飾的類沒有完全實現,還不能例項化。如果在類的方法宣告中使用abstract修飾符,表明該方法是一個抽象方法,它需要在子類實現。如果一個類包含抽象方法,則這個類也是抽象類,必須使用abstract修飾符,並且不能例項化。
(3)注意,抽象類除了包含抽象方法外,還可以包含具體的變數和具體的方法。類即使不包含抽象方法,也可以被宣告為抽象類,防止被例項化。

2、抽象類特點
(1)抽象類不能例項化,即不能對其用new運算子;
(2) 類中如果有一個或多個abstract方法,則該類必須宣告為abstract;
(3)抽象類中的方法不一定都是abstract方法,它還可以包含一個或者多個具體的方法;
(4)即使一個類中不含抽象方法,它也可以宣告為抽象類;
(5)抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類物件呼叫。
(6)如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。

3、什麼情況下,使用抽象類
(1)類中包含一個明確宣告的抽象方法;
(2)類的任何一個父類包含一個沒有實現的抽象方法;
(3)類的直接父介面宣告或者繼承了一個抽象方法,並且該類沒有宣告或者實現該抽象方法。

4、程式碼展示
抽象類不能被例項化,抽象方法必須在子類中被實現。請看下面的程式碼:

import static java.lang.System.*;
public final class Demo{
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.setName("小明");
        t.work();

        Driver d = new Driver();
        d.setName("小陳");
        d.work();
    }
}
// 定義一個抽象類
abstract class People{
    private String name;  // 例項變數

    // 共有的 setter 和 getter 方法
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }

    // 抽象方法
    public abstract void work();
}
class Teacher extends People{
    // 必須實現該方法
    public void work(){
        out.println("我的名字叫" + this.getName() + ",大家好...");
    }
}
class Driver extends People{
    // 必須實現該方法
    public void work(){
        out.println("我的名字叫" + this.getName() + ",大家好...");
    }
}
/*
執行結果:
我的名字叫小明,大家好...
我的名字叫小陳,大家好...
*/

5、關於抽象類的幾點說明
(1)抽象類不能直接使用,必須用子類去實現抽象類,然後使用其子類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項,也就是可以使用抽象類來充當形參,實際實現類作為實參,也就是多型的應用。
(2)建構函式和靜態函式以及final修飾的函式不能使用abstract修飾符。
(3)如果試圖建立一個抽象類的例項就會產生編譯錯誤。
(4)如果一個類是非抽象類卻包含一個抽象方法,就會產生編譯錯誤。
(5)抽象類中有建構函式。如果抽象類是父類,需要給子類提供例項的初始化。

6、abstract 關鍵字和哪些關鍵字不能共存?
final:被final修飾的類不能有子類。而被abstract修飾的類一定是一個父類。
private: 抽象類中的私有的抽象方法,不被子類所知,就無法被複寫。而抽象方法出現的就是需要被複寫。
static:如果static可以修飾抽象方法,那麼連物件都省了,直接類名呼叫就可以了。可是抽象方法執行沒意義。

相關文章