抽象的概念
- 抽象類和抽象方法是面向對象編程中的重要概念,用于實現抽象和繼承的特性。
- 抽象類是不能被實例化的類,通常用作其他類的基類。
- 抽象方法是在抽象類中聲明但沒有具體實現的方法,需要在子類中實現具體的功能。
抽象類的用途
假設我們開了一個汽車玩具廠,現在要造奔馳和寶馬系列玩具。這兩種玩具的功能基本是一致,只是車的喇叭音樂不同。
由于只是車的內置喇叭(trumpet) 不同,那么我們造的時候,我們首先開發一套車的模板 (Car) 即可,車的骨架、內部零件什么的都用一樣的。生產奔馳(Benchi) 系列的車,我們去奔馳車間給他裝上奔馳的內置喇叭 (Benchi extends Car) ;生產寶馬系列的車,我們去寶馬(Baoma) 車間給他裝上寶馬的內置喇叭 (Baoma extends Car)。
現在,我們奔馳系列的車模板和寶馬系列的車模板就造好了,出廠每一個車的時候,給車模套上車殼就完工了。
我們把生產汽車模板的過程抽象成一個Car類。
JAVA復制代碼abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 每個車都可以跑
void run(){
System.out.println(this.name + "跑起來了");
}
// 每個車的喇叭
abstract void trumpet()
}
由于每個車都必須有喇叭,因此trumpet方法是必須存在的。但每個系列的車喇叭不同,因此,在Car類中,我們無法具體指明方法內容(沒有寫方法體)。這個trumpet方法就是一個抽象方法, 我們用abstract給他標記一下。
由于Car缺少喇叭、車殼等零件(trumpet是抽象抽象方法,Car因此是抽象類),因此它無法直接生產玩具(不能實例化)。我們需要去不同車間繼續完善它 (只能被子類繼承、完善方法) 。
我們去奔馳車間給他裝上奔馳的喇叭,奔馳系列玩具的車模就做好了。
java復制代碼class Bnechi extends Car {
public Bnechi(String name){
super(name);
}
public void trumpet(){
System.out.println("我是奔馳,啦啦啦");
}
}
然后,我們去寶馬車間給他裝上喇叭,寶馬系列的玩具車模就做好了
scala復制代碼class Baoma extends Car {
public Baoma(String name){
super(name);
}
public void trumpet(){
System.out.println("我是寶馬,啦啦啦");
}
}
最后,我們在奔馳和寶馬車間就可以不斷的生產玩具了。
上面的代碼中,我們定義了一個sountrumpetd方法,這是Car必須有的方法,但是每個子類(奔馳、寶馬)的這個方法是不同的,因此我們無法具體寫成這個方法的內容。
那么,這個sound方法就是一個抽象方法,對應的,Car就是一個抽象類。Car是不完整的,因此它不能直接生產成一個玩具車 (不能實例化)。
我們需要用Car這個模板來完善我們的奔馳系列玩具
java復制代碼public class CarFactory {
public static void mAIn(String[] args) {
// 生產奔馳
Bnechi BCA = new Bnechi("奔馳A級");
BCA.run();
BCA.trumpet();
// 生產寶馬
Baoma BMW1 = new Baoma("寶馬1系");
BMW1.run();
BMW1.trumpet();
}
}
語法詳解
抽象類
抽象類使用abstract關鍵字進行聲明,它可以包含抽象方法和普通方法。
它無法直接創建抽象類的實例,只能通過繼承它的子類來使用。抽象類通常用于定義類的共同特征和行為,而將具體的實現細節留給子類來完成。
示例代碼:
java復制代碼abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 普通方法
void run(){
System.out.println(this.name + "跑起來了");
}
// 抽象方法,子類需要實現具體的功能,不寫函數體
abstract void trumpet()
}
- 聲明了一個String類型的變量name,表示車的名稱。
- 定義了一個構造方法Car(String name) ,用于初始化車的名稱。
- 聲明了一個非抽象方法run() ,用于輸出車名并顯示它在跑。
- 聲明了一個抽象方法trumpet() ,沒有具體實現,需要在子類中重寫。
抽象方法
抽象方法是在抽象類中聲明但沒有具體實現的方法,它使用abstract關鍵字進行聲明。抽象方法沒有方法體,只有方法簽名,子類必須實現這些抽象方法,否則子類也必須聲明為抽象類。
示例代碼:
java復制代碼abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 每個車都可以跑
void run(){
System.out.println(this.name + "跑起來了");
}
// 每個車的音樂
abstract void trumpet();
}
// 子類繼承父類
class Bnechi extends Car {
public Bnechi(String name){
super(name);
}
// 子類完善父類的抽象方法
public void trumpet(){
System.out.println("我是奔馳,啦啦啦");
}
}
// 子類繼承父類
class Baoma extends Car {
public Baoma(String name){
super(name);
}
// 子類完善父類的抽象方法
public void trumpet(){
System.out.println("我是寶馬,啦啦啦");
}
}
抽象類和抽象方法的使用場景:
- 當某個類的對象不需要直接創建,而只作為其他具體類的基類模板時,可以將該類聲明為抽象類。
- 當多個類擁有相似的行為,但在具體實現上有所不同,可以將共同的行為定義在抽象類中,具體實現交給子類。
- 抽象類和抽象方法可以幫助實現多態性,即通過父類引用指向子類對象,便于統一處理不同子類的對象。