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