接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態的main方法。
1.抽象類是否可繼承實體類 (concrete class)
答:抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數。其實Object就是個實體類,Java的API文檔里,每個抽象類的條目里都明確寫著直接或間接繼承自Object,所以這點是沒有疑問的。關鍵在于實體類必須有明確的構造函數
如下:
public class A {
public static void main(String[] args) {
}
}
abstract class B extends A {
}
編譯通過,也可以運行。這里沒有寫A的構造方法,那么為什么抽象類B依然可以繼承實體類,這是因為系統默認為A寫了無參的構造方法。
如果將A的構造方法,手動定義為private,那么B將無法繼承自A,如下:
public class A {
private A() {
}
public static void main(String[] args) {
}
}
abstract class B extends A {
}
此時B就不能繼承A。
2.抽象類中是否可以有靜態的main方法?
可以
如下:
abstract class A{
public static void main(String[] args) {
System.out.println("hello");
}
}
可以輸出hello,說明抽象類可以有main方法。
總結:
抽象類:
- 抽象類不能用來實例化對象,聲明抽象類的唯一目的是為了將來對該類進行擴充。
- 一個類不能同時被 abstract 和 final 修飾。如果一個類包含抽象方法,那么該類一定要聲明為抽象類,否則將出現編譯錯誤。
- 抽象類可以包含抽象方法和非抽象方法。
抽象方法:
- 抽象方法是一種沒有任何實現的方法,該方法的的具體實現由子類提供。
- 抽象方法不能被聲明成 final 和 static。
- 任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類。
- 如果一個類包含若干個抽象方法,那么該類必須聲明為抽象類。抽象類可以不包含抽象方法。
- 抽象方法的聲明以分號結尾,例如:
public abstract sample();