在Java中,除了普通的類別(class)之外,還有枚舉(Enum)、抽象類別(Abstract Class)和介面(Interface)等不同的概念和機制,每個都有其獨特的用途和優勢,我們將討論它們的定義、用途以及何時使用它們。
抽象類別是一種不能實例化的類別,它用於定義其他類別的基本結構和行為。抽象類別通常包含一個或多個抽象方法,這些方法沒有具體的實現,只有方法的簽名。子類別必須實現(覆蓋)這些抽象方法,以具體實現其功能。
在某些情況下,某個父類別只是知道其子類別應該包含怎樣的方法,但無法準確地知道這些子類別如何實作這些方法。例如定義了一個 Shape類別,這個類別應該提供一個運算周長的方法calPerimetero,但不同 Shape 子類别對周長的運算方法是不一樣的,即 Shape 類別無法準確地知道其子類別運算周長的方法(即形狀不同周長的計算方法不同)。
1.3.1.
abstract 可以用來修飾的有: 1. 類別 2. 方法
1.3.2.
抽象類別必須使用abstract修飾詞來修飾,抽象方法也,必須使用abstract修飾詞來
修飾,抽象方法不能有方法體。(可以記成不能有{})
1.3.3.
抽象類别不能被實例化,無法使用new關鍵字來呼叫抽象類別的建構子建立抽
象類別的實例。即使抽象類別裡不包含抽象方法,這個抽象類別也不能建立實
例,只能當作父類別,被其他子類別繼承,子類要完整父類。
1.3.4.
抽象類別可以包含成員變數、方法(普通方法和抽象方法都可以)、建構子、
初始化區塊、内部類别(介面、列舉)5種成分。
1.3.5.
被定義成抽象類別:任何有包括到抽象方法的情況:
1.3.6.
不能和final同時使用
因為當使用 abstract 修飾類別時,表明這個類別只能被繼承;當使用 abstract 修飾方
法時,表明這個方法必須由子類別提供實作(即覆寫),然而final 修飾的類別不能被繼承
,final 修飾的方法也不能被覆寫
1.3.7.
不能和static 一起修飾方法
因為當使用 static 修飾一個方法時,表明這個方法屬於該類别本身,即通過類別就可呼叫該方法,但如果該方法被定義成抽象方法,則將導致通過該類別來呼叫該方法時出現錯誤(呼叫了一個沒有方法體的方法肯定會引起錯誤)。因此 static和abstract 不能同時修飾某個方法,即没有所謂的類別抽象方法。但可以同時修飾內部類別(之後會提到)
1.3.8.
private和abstract不能同時修飾方法
abstract關鍵字修飾的方法必須被其子類別覆寫才有意義,否則這個方法將永遠不會有方法體,因此abstract方法不能定義為private存取權限
下面定義一個Shape 類別
public abstract class Shape {
private String color;
//定義一個運算周長的抽象方法
public abstract double calPerimeter();
//定義一個返回形狀的抽象方法
public abstract String getType();
//定義Shape 建構子,建構子並不適用於建立Shape 物件而是用於被子類別呼叫
public Shape() {}
public Shape(String color) {
System.out.println("執行Shape 的建構子");
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
解釋一下上面Shape類別做了什麼事~
下面定義一個Triangle類別繼承Shape類別:
public class Triangle extends Shape{
//定義三個邊
private Double a;
private Double b;
private Double c;
public Triangle(String color, Double a, Double b, Double c) {
super(color);
this.setSides(a, b ,c);
}
public void setSides(Double a, Double b, Double c) {
if(a >= b + c || b >= a+c || c >= a + b) {
System.out.println("三角形兩邊之和必須大於第三邊");
return;
}
this.a = a;
this.b = b;
this.c = c;
}
@Override
public double calPerimeter() {
return a + b + c;
}
@Override
public String getType() {
return "三角形";
}
}
上面的 Triangle 類別因為繼承了 Shape 抽象類别,需要實作了 Shape 類別中兩個抽象方法,Triangle 類別是一個普通類別,因此可以建立 Triangle 頻別的實例,可以讓一個 Shape 類型的參照變數指向 Triangle 物件。
今天就先到這邊~