abstract:
修飾符號,聲明抽象方法和抽象類。聲明方法時表示該方法只有特征簽名,沒有具體實現。而是把具體實現留給繼承該類的子類,並且抽象類不能直接用new來實例化對象即使有公共的構造函數。
1,abstract修飾類,會使這個類成為一個抽象類,這個類將不能生成對象實例,但可以做為對象變量聲明的類型,也就是編譯時類型,抽象類就像當於一類的半成品,需要子類繼承並覆蓋其中的抽象方法。
2,abstract修飾方法,會使這個方法變成抽象方法,也就是只有聲明(定義)而沒有實現,實現部分以";"代替。需要子類繼承實現(覆蓋)。
abstract和interface:
基本用法:
abstract可以有自己的數據成員,也可以有非abstract的成員方法。
interface只能有static final的數據成員(一般不定義數據成員),不允許有非abstract成員方法。
高級用法:
abstract class是一個類,抽象的而已,不能被實例化,用於子類繼承,表示“is-a”的關系。關鍵字extends,Java中只能是單繼承。子類繼承時,可以不全部覆蓋父類的abstract方法,這是子類任然是一個abstract class。
interface是接口,沒有類的概念,是一份“大家”都遵守的契約,用於實現接口,表示“like-a”的關系。關鍵字implements,可以實現多個接口。實現接口時,必須覆蓋接口的所有方法。
例子:(門和報警門)
抽象類 門
abstract class Door {
abstract void open ();
abstract void close ();
}(並不是所有的門都有“報警”功能,但是所有的門都有“開”和“關”的功能)
接口 報警功能
interface Alarm {
void alarm();
}
有報警功能的門
class AlarmDoor extends Door implements Alarm {
void open() {...}
void close() {...}
void alarm() {...}
}