1.
Java抽象類、接口、內部類和泛型
1.抽象類除了包含抽象方法外,還可以包含具體的變量和具體的方法。類即使不包含抽象方法,也可以被聲明爲抽象類,防止被實例化。
關於抽象類的幾點說明:
- 抽象類不能直接使用,必須用子類去實現抽象類,然後使用其子類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例,也就是可以使用抽象類來充當形參,實際實現類作爲實參,也就是多態的應用。
- 不能有抽象構造方法或抽象靜態方法。
在下列情況下,一個類將成爲抽象類:
- 當一個類的一個或多個方法是抽象方法時;
- 當類是一個抽象類的子類,並且不能爲任何抽象方法提供任何實現細節或方法主體時;
- 當一個類實現一個接口,並且不能爲任何抽象方法提供實現細節或方法主體時;注意:
- 這裏說的是這些情況下一個類將成爲抽象類,沒有說抽象類一定會有這些情況。
- 一個典型的錯誤:抽象類一定包含抽象方法。 但是反過來說“包含抽象方法的類一定是抽象類”就是正確的。
- 事實上,抽象類可以是一個完全正常實現的類
注意:接口中聲明的成員變量默認都是 public static final 的,必須顯示的初始化。因而在常量聲明時可以省略這些修飾符。
* 接口是若干常量和抽象方法的集合,目前看來和抽象類差不多。
1) 接口中只能定義抽象方法,這些方法默認爲 public abstract 的,因而在聲明方法時可以省略這些修飾符。
3) 接口中沒有構造方法,不能被實例化。
4) 一個接口不實現另一個接口,但可以繼承多個其他接口。接口的多繼承特點彌補了類的單繼承。
* 接口必須通過類來實現(implements)它的抽象方法,然後再實例化類。類實現接口的關鍵字爲implements。
* 如果一個類不能實現該接口的所有抽象方法,那麼這個類必須被定義爲抽象方法。
* 不允許創建接口的實例,但允許定義接口類型的引用變量,該變量指向了實現接口的類的實例。
3...
* 下面說一下抽象類和接口的主要區別。
1) 抽象類可以爲部分方法提供實現,避免了在子類中重複實現這些方法,提高了代碼的可重用性,這是抽象類的優勢;而接口中只能包含抽象方法,不能包含任何實現。
2) 一個類只能繼承一個直接的父類(可能是抽象類),但一個類可以實現多個接口,這個就是接口的優勢。
綜上所述,接口和抽象類各有優缺點,在接口和抽象類的選擇上,必須遵守這樣一個原則:
- 行爲模型應該總是通過接口而不是抽象類定義,所以通常是優先選用接口,儘量少用抽象類。
- 選擇抽象類的時候通常是如下情況:需要定義子類的行爲,又要爲子類提供通用的功能。
- 泛型是 Java 1.5 的新增特性,它以C++模板爲參照,本質是參數化類型(Parameterized Type)的應用。
- 類型參數只能用來表示引用類型,不能用來表示基本類型,如 int、double、char 等。但是傳遞基本類型不會報錯,因爲它們會自動裝箱成對應的包裝類。