# 什麼是抽象?
我們可以定義一個 Animal 類別,但實際上有這種東西嗎?顯然的,我們都只能舉出動物的實例,所以說,動物只是一個概念,並沒有一種生物叫作動物。
# 抽象類別
利用 abstract
關鍵字可以修飾掉類別,將類別轉為抽象:
abstract class 類別名{ | |
// 成員定義 | |
} |
以動物作為例子:
abstract class Animal{ | |
int height,weight; | |
void move(){ | |
System.out.println("move...move..."); | |
} | |
} |
這邊必須強調,抽象只是一個概念,而不是一個存在的實體。
同樣的,抽象類別不能被實體化。
錯誤示範
class Test{ | |
public static void main(String[] args){ | |
Animal ani = new Animal(); | |
} | |
} |
Exception in thread "main" java.lang.Error: Unresolved compilation problem: | |
Cannot instantiate the type Animal |
若是想要運用抽象類別,就必須使用繼承的方式!!
abstract class Animal { | |
// 成員定義 | |
} | |
class Dog extends Animal { | |
// 成員定義 | |
} | |
class Bird extends Animal { | |
// 成員定義 | |
} |
擁有這個概念的類別,繼承抽象類別,在程式撰寫上就可以利用多型的概念上程式更有邏輯性。
# 抽象方法
利用 abstract
可以使方法變成抽象方法,抽象方法只能寫方法的原型,無法定義方法的本體。
// 使用格式 | |
abstract 回傳型態 方法名稱(<參數...>); | |
// 範例 | |
abstract void eat(); |
danger 錯誤範例
抽象方法內部是不可定義本體的喔!!!
abstract void eat(){ | |
// 無論是否有內容物都會報錯 | |
} |
Abstract methods do not specify a body |
抽象方法必須使用覆寫的方式定義方式的本體!!
abstract class Animal { | |
abstract void eat(); | |
} | |
class Dog extends Animal{ | |
void eat(){ | |
System.out.println("啃骨頭..."); | |
} | |
} |
特別注意的是,抽象方法只能定義在抽象類別中。 (否則會編譯錯誤)