原文鏈接:www.baidu.com
抽象類概述
父類中的方法,被它的子類們重寫,子類各自的實現都不盡相同。那麼父類的方法聲明和方法主體,只有聲明還有 意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱爲抽象方法。Java語法規定,包含抽象方法的類就是抽象類。抽象方法所在的類,必須是抽象類才行。
抽象方法
使用 abstract 關鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個方法名,而沒有方法體。
定義格式:
- 修飾符 abstract 返回值類型 方法名 (參數列表);
例如:
public abstract void eat();
抽象類
如果一個類包含抽象方法,那麼該類必須是抽象類。
定義格式:
abstract class 類名字 {
}
例如:
//抽象類
public abstract class Animal {
//抽象方法
public abstract void run();
}
抽象的使用
繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須聲明爲抽象類。最終,必須有子類實現該父 類的抽象方法,否則,從最初的父類到最終的子類都不能創建對象,失去意義。
如何使用抽象類和抽象方法:
- 不能直接創建new抽象類對象。
- 必須用一個子類來繼承抽象父類。
- 子類必須覆蓋重寫抽象父類當中所有的抽象方法。覆蓋重寫(實現):子類去掉抽象方法的abstract關鍵字,然後補上方法體大括號。
- 創建子類對象進行使用。
代碼舉例
定義抽象類
package demo11;
//定義一個抽象類
public abstract class DemoAnimal {
//定義一個抽象方法
public abstract void eat();
}
定義實現類Cat
package demo11;
public class DemoCat extends DemoAnimal {
@Override
public void eat() {
System.out.println("我喜歡吃魚");
}
}
定義實現類Dog
package demo11;
public class DemoDog extends DemoAnimal {
@Override
public void eat() {
System.out.println("我喜歡吃骨頭");
}
}
定義測試類
package demo11;
public class Test {
public static void main(String[] args) {
//創建實現類對象
DemoCat demoCat = new DemoCat();
// 調用重寫後的方法
demoCat.eat();
//創建實現類對象
DemoDog demoDog = new DemoDog();
// 調用重寫後的方法
demoDog.eat();
}
}
代碼運行之後結果
注意事項
關於抽象類的使用,以下爲語法上要注意的細節,雖然條目較多,但若理解了抽象的本質,無需死記硬背。
1. 抽象類不能創建對象,如果創建,編譯無法通過而報錯。只能創建其非抽象子類的對象。
- 理解:假設創建了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
2. 抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的。
- 理解:子類的構造方法中,有默認的super(),需要訪問父類構造方法。
3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
- 理解:未包含抽象方法的抽象類,目的就是不想讓調用者創建該類對象,通常用於某些特殊的類結構設 計。
4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象 類。
- 理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼創建對象後,調用抽象的方法,沒有 意義。