1.抽象類可以有構造方法,介面沒有構造方法 Multiple markers at this line - Interfaces cannot have constructors - Syntax error on token "}", delete this token 2.一個子類只能繼承一個抽 ...
1.抽象類可以有構造方法,介面沒有構造方法
Multiple markers at this line
- Interfaces cannot have constructors
- Syntax error on token "}", delete this
token
2.一個子類只能繼承一個抽象類,但能實現多個介面
java不支持多重繼承
3.抽象類可以有普通成員變數,介面沒有普通成員變數
成員變數(在類中定義, 訪問修飾符 修飾符 type name = value)
Abstract methods do not specify a body
4.抽象類和介面都可有靜態成員變數,抽象類中靜態成員變數訪問類型任意,介面只能public static final(預設)
5.抽象類可以沒有抽象方法,抽象類可以有普通方法,介面中都是抽象方法
抽象類和普通類的區別就在於,抽象類不能被實例化,就是不能被new出來,即使抽象類裡面沒有抽象方法。
抽象類的作用在於子類對其的繼承和實現,也就是多態;
而沒有抽象方法的抽象類的存在價值在於:實例化了沒有意義,因為類已經定義好了,不能改變其中的方法體,但是實例化出來的對象卻滿足不了要求,只有繼承並重寫了他的子類才能滿足要求。所以才把它定義為沒有抽象方法的抽象類
介面:無論你加不加abstract,所有實現指定介面的類都必須重寫並實現該介面的所有方法
6.抽象類可以有靜態方法,介面不能有靜態方法
java8介面中可以有default類型的方法,實現類可以選擇實現該方法。
jdk8已經支持介面加入靜態方法,但據說是為了lambda(函數式編程)
詳情:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#section1
7. 抽象類中的方法可以是public、protected;介面方法只有public
附
特點 |
抽象類 |
介面 |
構造方法 |
有 |
無 |
普通成員變數 |
有 |
無 |
普通方法 |
可以有非抽象的 |
必須是抽象的 |
抽象方法的訪問類型 |
public、protected和預設 |
只能是public的,預設public abstract |
靜態方法 |
可以有 |
無 |
靜態成員變數 |
有 |
有 public static final的 |
其他類 |
只能繼承一個抽象類 |
可以實現多個介面 |
應用場景 |
代碼重用 | 模塊之間通信契約 |