java abstract修飾符

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虛擬機無法執行這個方法



發佈了63 篇原創文章 · 獲贊 20 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章