目錄abstract class 和 interface 有什麼區別1.抽象類1.1抽象類的格式1.2抽象類註意事項2.介面2.1介面的格式2.2介面可以多繼承2.3介面的實現(implements)3.異同 abstract class 和 interface 有什麼區別 1.抽象類 抽象類:聲明 ...
目錄
abstract class 和 interface 有什麼區別
1.抽象類
抽象類:聲明方法的存在而不實現的類,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,它只能被繼承,派生出子類,這樣的父類就是抽象類。
1.1抽象類的格式
[public] abstract class 類名 [extends父類] [implements介面列表]
{
//屬性聲明及初始化;
//抽象方法的聲明;
//非抽象方法聲明及方法體;
}
1.2抽象類註意事項
1.修飾抽象類的修飾符有public和預設修飾符兩種;
2.抽象類中可以有抽象方法,也可以有非抽象的方法;
3.抽象方法是無方法體的方法。
4.定義抽象類時,要在關鍵字class的前面添加abstract。
5.抽象類不能被實例化;
6.其包含的抽象方法必須在其子類中被實現,否則該子類只能聲明為abstract;
7.抽象方法不能為static;
8.在下列情況下,一個類必須聲明為抽象類:
- 當一個類的一個或多個方法是抽象方法時;
- 當類是一個抽象類的子類,並且沒有實現父類的所有抽象方法,即只實現部分;
- 當一個類實現一個介面,並且不能為全部抽象方法都提供實現時;
2.介面
由於類的多繼承能夠導致方法調用的衝突,所以Java中的類只能單繼承。但是很多時候還是需要多繼承的,Java中的介面就可以實現多繼承,介面中不存在具體方法,不會引起方法調用的衝突。instanceof運算符可以用來決定某對象的類是否實現了介面
2.1介面的格式
[public] interface 介面名 [extends 父介面列表]{
// 屬性聲明,不寫也是公共常量
[public] [static] [final] 屬性類型屬性名 = 常量值 ;
// 方法聲明
[public] [abstract] 返回值類型方法名 ( 參數列表 ) ;
}
1.介面中只包含常量和抽象方法,而沒有變數和方法的實現,介面對類來說是一套規範,是一套行為協議。
2.介面不是一個類,不能實例化。
3.介面規定了類的共同行為。
4.在Java中,介面的聲明採用interface關鍵字,介面不是一個類,沒有構造方法,不能被實例化。
5.修飾介面的修飾符只有public和預設修飾符兩種,不寫也是public的
6.介面可以是多繼承,介面只能繼承介面,不能繼承類。
7.屬性必須是常量(有初值),方法必須是抽象的(無方法體)。
2.2介面可以多繼承
//B,C也是介面
public interface A extends B,C {
}
2.3介面的實現(implements)
如果一個類要實現一個介面,那麼這個類就必須實現介面中所有抽象方法。否則這個類只能聲明為抽象類,多個無關的類可以實現一個介面,一個類可以實現多個無關的介面,一個類可以在繼承一個父類的同時,實現一個或多個介面。
class 類名 [extends 父類] [implements 介面列表]
{
覆蓋所有介面中定義的方法;
}
3.異同
相同:子類必須實現它門的抽象方法,抽象類與介面都不能創建自己的對象
不同:繼承使用extends,介面的實現用implements
抽象類可以沒有抽象方法,介面中方法都是抽象的
抽象類可以有自己構造器及普通方法,介面中沒有構造器
子類只能繼承一個抽象類,但可以實現多個介面
抽象類主要通過共用的屬性,介面主要提供共用的方法