Java抽象(abstract)類詳解

2020-07-16 10:05:15
Java 語言提供了兩種類,分別為具體類和抽象類。前面學習接觸的類都是具體類。這一節介紹一下抽象類。

在物件導向的概念中,所有的物件都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,那麼這樣的類稱為抽象類

在 Java 中抽象類的語法格式如下:
<abstract>class<class_name> {
    <abstract><type><method_name>(parameter-iist);
}
其中,abstract 表示該類或該方法是抽象的;class_name 表示抽象類的名稱;method_name 表示抽象方法名稱,parameter-list 表示方法參數列。

如果一個方法使用 abstract 來修飾,則說明該方法是抽象方法,抽象方法只有宣告沒有實現。需要注意的是 abstract 關鍵字只能用於普通方法,不能用於 static 方法或者構造方法中。

抽象方法的 3 個特徵如下:
  1. 抽象方法沒有方法體
  2. 抽象方法必須存在於抽象類中
  3. 子類重寫父類別時,必須重寫父類別所有的抽象方法

注意:在使用 abstract 關鍵字修飾抽象方法時不能使用 private 修飾,因為抽象方法必須被子類重寫,而如果使用了 private 宣告,則子類是無法重寫的。

抽象類的定義和使用規則如下:
  1. 抽象類和抽象方法都要使用 abstract 關鍵字宣告。
  2. 如果一個方法被宣告為抽象的,那麼這個類也必須宣告為抽象的。而一個抽象類中,可以有 0~n 個抽象方法,以及 0~n 個具體方法。
  3. 抽象類不能範例化,也就是不能使用 new 關鍵字建立物件。

例 1

不同幾何圖形的面積計算公式是不同的,但是它們具有的特性是相同的,都具有長和寬這兩個屬性,也都具有面積計算的方法。那麼可以定義一個抽象類,在該抽象類中含有兩個屬性(width 和 height)和一個抽象方法 area( ),具體步驟如下。

1)首先建立一個表示圖形的抽象類 Shape,程式碼如下所示。
public abstract class Shape {
    public int width; // 幾何圖形的長
    public int height; // 幾何圖形的寬

    public Shape(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public abstract double area(); // 定義抽象方法,計算面積
}
2)定義一個正方形類,該類繼承自形狀類 Shape,並重寫了 area( ) 抽象方法。正方形類的程式碼如下:
public class Square extends Shape {
    public Square(int width, int height) {
        super(width, height);
    }

    // 重寫父類別中的抽象方法,實現計算正方形面積的功能
    @Override
    public double area() {
        return width * height;
    }
}
3)定義一個三角形類,該類與正方形類一樣,需要繼承形狀類 Shape,並重寫父類別中的抽象方法 area()。三角形類的程式碼實現如下:
public class Triangle extends Shape {
    public Triangle(int width, int height) {
        super(width, height);
    }

    // 重寫父類別中的抽象方法,實現計算三角形面積的功能
    @Override
    public double area() {
        return 0.5 * width * height;
    }
}
4)最後建立一個測試類,分別建立正方形類和三角形類的物件,並呼叫各類中的 area() 方法,列印出不同形狀的幾何圖形的面積。測試類的程式碼如下:
public class ShapeTest {
    public static void main(String[] args) {
        Square square = new Square(5, 4); // 建立正方形類物件
        System.out.println("正方形的面積為:" + square.area());
        Triangle triangle = new Triangle(2, 5); // 建立三角形類物件
        System.out.println("三角形的面積為:" + triangle.area());
    }
}
在該程式中,建立了 4 個類,分別為圖形類 Shape、正方形類 Square、三角形類 Triangle 和測試類 ShapeTest。其中圖形類 Shape 是一個抽象類,建立了兩個屬性,分別為圖形的長度和寬度,並通過構造方法 Shape( ) 給這兩個屬性賦值。

在 Shape 類的最後定義了一個抽象方法 area( ),用來計算圖形的面積。在這裡,Shape 類只是定義了計算圖形面積的方法,而對於如何計算並沒有任何限制。也可以這樣理解,抽象類 Shape 僅定義了子類的一般形式。

正方形類 Square 繼承抽象類 Shape,並實現了抽象方法 area( )。三角形類 Triangle 的實現和正方形類相同,這裡不再介紹。

 

在測試類 ShapeTest 的 main( ) 方法中,首先建立了正方形類和三角形類的範例化物件 square 和 triangle,然後分別呼叫 area( ) 方法實現了面積的計算功能。

5)執行該程式,輸出的結果如下:
正方形的面積為:20.0
三角形的面積為:5.0