抽象類(Abstract):聲明方法的存在而不去實現它的類被稱為抽象類(abstract)它用于要創建一個體現某些基
本行為的類,并為該類聲明方法,但不能在該類中 實現該類的情況。不能創建 abstract 類的實例。然而
可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或 抽 象 靜態方法。 Abstract 類的子類為它們父類中的所有抽象方法提供實現, 否則它們也是抽象類為。 取 而代 之,在子類中實現該方法。知道其行為的其它 類可以在類中實現這些方法。
接口( interface ):是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而
獲得。接口 中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義 static final 成員變量。接口
的實現與子類相似,除了該實現類不能從接口定義中繼承 行為。當類實現特殊接口時,它定義(即將程序
體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有
抽象類,它 允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從
1.相同點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的子類可以有選擇地實現。 這個選擇有兩點含義: 1):是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。 2):是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次聲明其方法為抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明為抽象類。既是抽象類,當然也不能實例化。 E. abstract class是interface與Class的中介。 interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明PRivate及protected的方法,不能定義方法體,也 不能聲明實例變量。然而,interface卻可以聲明常量變量,并且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作為接 口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract class或Class中。 abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規范子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己 的實例變量,以供子類通過繼承來使用。接口類型轉換, instanceof 運算符可以用來決定某對象的 類是否實現了接口。
最重要的,也是經常在面試中問到的:
1.接口是可以繼承(extends)接口的。
2.抽象類也是可以實現(implements)接口的,但是抽象類不可以繼承(extends)接口
3.抽象類是否可以繼承(extends)實體類,是可以的但是前提是實體類必須要有明確的構造函數。
新聞熱點
疑難解答