抽象方法(例如:畫方法)
- 抽象方法必須用abstract void修飾
- 抽象方法沒有方法體(方法體就是方法的實現)
- 抽象方法和空方法體的方法不是同意概念。
a) public abstract void Test();為抽象方法,沒有方法體;
b) public void Test(){};為普通方法,有方法體但為空,因此這個方法不能用
抽象類(例如:圖形類)
- 定義:使用了關鍵詞abstract聲明的類叫作“抽象類”
- 抽象類可以包含的成員:
a) 屬性
b) 方法(普通方法,構造方法,抽象方法)
c) 初始化塊
d) 內部類
e) 枚舉類
3. 抽象類的說明:
a) 抽象類不可以被實例化(即使有構造方法)
b) 抽象類的構造方法不能用於實例化,主要用於子類的調用
c) 抽象類的子類可以是(不實現抽象的抽象方法的)抽象類,也可以是實現了抽象類中所有抽象方法的普通類
接口
- 定義:在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來生命
- 接口可以包含的成員:
a) 靜態常量
b) 抽象方法
3. 接口的說明:
a) 接口中的所有方法必須是抽象方法
b) 接口中沒有構造方法
c) 接口不能用於實例化對象
d) 接口和類之間的關系是實現,接口與接口之間的關系是繼承
e) 接口可以繼承多個接口
f) 接口的實現類可以是(不實現接口的抽象方法的)抽象類,也可以是實現了接口中所有抽象方法的普通類
g) 接口並不是類,編寫接口的方式和類很相似,但是他們屬於不同的概念,接口是一個抽象類型,類類型、接口類型、數組類型都是引用類型,它們是同級關系
抽象類和接口比較
同:
都不能被實例化
都屬於引用類型
異:
抽象類可以有實例變量,接口只能有靜態常量
接口只能有抽象方法,抽象類可以有抽象方法也可以有普通方法
向下:抽象類只能繼承一個,接口可以實現多個
向上:抽象類只能有一個父類(單一繼承),接口可以有多個父接口(多重繼承)
接口的實現
1. 定義:類使用implements關鍵字實現接口
2. 格式:[修飾符] class 類名 implements 接口名[其它接口,其它接口,…]{ }
3. 關於接口實現的說明:
實現是相對於接口來說的,只有接口有實現
接口為什么可以多繼承
在接口中不能有實例變量,只能有靜態的常量,不能有具體的方法(包含方法體),只能有抽象方法,因此也就摒棄了多繼承的缺點
對於第一個缺點(父類實例變量重名時調用出錯):因為接口只有靜態的常量,但是由於靜態變量是在編譯期決定調用關系的,即使存在一定的沖突也會在編譯時提示出錯;而引用靜態變量一般直接使用類名或接口名,從而避免產生歧義
對於第二個缺點(父類方法名重名時調用出錯):一個類實現多個接口,因為接口只有抽象方法,具體方法只能由實現接口的類實現,在調用的時候始終只會調用實現類的方法(不存在歧義)
多繼承的缺點
- 如果在一個子類繼承的多個父類中擁有相同名字的實例變量,子類在引用該變量時將產生歧義
- 如果在一個子類繼承的多個父類中擁有相同方法,子類中有沒有覆蓋該方法,那么調用該方法時將產生歧義,無法判斷應該調用哪個父類的方法