abstract修飾符
- 用abstract修飾的類叫做抽象類,抽象類不能被實例化
- 用abstract修飾的方法叫做抽象方法,抽象方法沒有方法體
抽象類的規則:
1、抽象類可以沒有抽象方法,但有抽象方法的類必須是抽象類;
2、抽象類的子類沒有重寫實現父類的所有抽象方法(當然可以實現爲空,即方法體爲空),則子類必須被定義爲抽象類;
abstract class Base{
abstract void method1();
abstract void method2();
}
class Sub extends Base{ //編譯出錯,Sub類沒有實現父類的所有抽象方法,必須被定義爲抽象類
void method1(){
System.out.println("method1");
}
}
3、抽象類可以有構造方法,但不能是抽象構造方法;
abstract class Base{
abstract void Base(); //編譯出錯,構造方法不能是抽象的
}
4、抽象類可以有靜態方法,但是沒有靜態抽象方法;
abstract class Base{
abstract void Base(); //編譯出錯,構造方法不能是抽象的
static abstract void method1(); //編譯出錯,不能有抽象靜態方法
static void method2(); //可以有靜態方法
}
5、抽象類和抽象方法不能被final修飾符修飾,因爲抽象方法必須有子類實現,而final不允許有子類,不能被子類方法覆蓋;abstract 與 final不能連用
爲什麼抽象類不允許被實例化?
1、在語義上
抽象類表示從一些具體類中抽象出來的類型,例如蘋果類,香蕉類是具體類,水果類是抽象類。自然界並不存在水果類本身的實例。蘋果對象是水果對象,香蕉對象也是水果對象。
- 當父類是具體類時,父類的對象包括父類本身的對象和所有子類的具體對象;
- 當父類是抽象類時,父類的對象包括所有具體子類的對象;
因此,所謂的不能被實例化,是指不能創建抽象類本身的實例。
2、在語法上
假如可以創建抽象類本身的實例,因爲method2() 方法是抽象方法,沒有方法體,所有無法執行。因此,java編譯器不允許創建抽象類的實例。
abstract class Base{
public void method1(){ //普通方法
}
public abstract void method2(); //抽象方法
}
Bsse base = new Base();//假使java編譯器沒報錯
base.method1();
base.method2();//運行時java虛擬機無法執行這個方法