Interface 和 Abstract 異同....
1.相同及聯系
A.兩者都是抽象類,都不能實例化.
B.Interface實現類及Abstract子類都必須要實現已經聲明的抽象方法.
2.不同
A.Interface實現需要用implements,而Abstract被子類繼承需要extends.
B.一類可以實現多個接口,但一個類只能繼承一個Abstract class.
C. Interface強調特定功能的實現,而Abstract class強調所屬關系。
D.盡管Interface實現類及Abstract的子類都必須實現抽象方法.但實現形式不同,Interface每一個方法都是抽象方法,都只是聲明(declaration, 沒有方法體),實現類必須實現.而Abstract class的子類可以有選擇的實現,這個選擇可以有兩點含義:
一是Abstract class 中的并非所有的方法都是抽象,只有那此冠有abstract才是抽象方法,子類必須實現.而沒有abstract的方法,在abstract class中必須定義方法體.
二是Abstract class的子類在繼承時,對非抽象方法即可繼承,也可以override.而對抽象方法,可以選擇實現,也可以在次聲明其方法是抽象方法,其實現可以由子類實現.但此類也必須是抽象類,也不能對其實例化.
E.abstract class 是interface和class中介
interface完全是抽象的,只能聲明方法,類型是public,不可以是private及proteced.不能定義方法體,也不能聲明實例變量.然而,interface卻可以聲明常量變量,并且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作為接口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract class或Class中。
abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規范子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。
三. interface的應用場合
A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。
B. 作為能夠實現特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。
C. 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。
D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。
四. abstract class的應用場合
一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:
A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。abstract的中介作用可以很好地滿足這一點。
C. 規范了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能。