Java 重溫抽象類的使用
抽象類的使用大部分都是根據定義上來的 下面是基本的定義,來源網上
當多個類中出現相同功能,但是功能主體不同,
這是可以進行向上抽取。這時,只抽取功能定義,而不抽取功能主體。
抽象類的特點:
1,抽象方法一定在抽象類中。
2,抽象方法和抽象類都必須被abstract關鍵字修飾。
3,抽象類不可以用new創建對象。因爲調用抽象方法沒意義。
4,抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。
如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。
抽象類和一般類沒有太大的不同。
該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的東西。
這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體。
通過抽象方法來表示。
抽象類比一般類多個了抽象函數。就是在類中可以定義抽象方法。
抽象類不可以實例化。
特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。
注意:
abstract 關鍵字,和哪些關鍵字不能共存。
final:被final修飾的類不能有子類。而被abstract修飾的類一定是一個父類。
private: 抽象類中的私有的抽象方法,不被子類所知,就無法被複寫。
而抽象方法出現的就是需要被複寫。
static:如果static可以修飾抽象方法,那麼連對象都省了,直接類名調用就可以了。
可是抽象方法運行沒意義。
抽象類中是否有構造函數?
有,抽象類是一個父類,要給子類提供實例的初始化。
我這裏實現一個案例是,把共同的代碼抽取出來成爲一個抽象類,然後子類繼承抽象類,各個模塊可以重寫父類的方法。
案例父類:AbTest.java
/**
* 模板方法抽象類
*
* @author liyue
* @date 2019/8/28 14:22
*/
public abstract class AbTest {
//把重複的代碼抽象在父類。
void get(){
System.out.println("開始執行get方法,這一塊以後寫共同業務的代碼");
add();
remove();
sys();
}
abstract void add();
abstract void remove();
void sys(){
System.out.println("我是最後執行的方法,可以寫共同業務的代碼");
}
}
子類:
/**
* @author liyue
* @date 2019/8/28 14:27
*/
public class Test002 extends AbTest {
@Override
void add() {
System.out.println("我是子類 執行add方法了");
}
@Override
void remove() {
System.out.println("我是子類 執行remove方法了");
}
public static void main(String[] args) {
//調用的是子類的get()方法。
new Test002().get();
}
}
執行結果圖:
抽象類很重要在一些抽取業務邏輯上。