1. 程式人生 > >Java 基礎知識彙總系列(三)

Java 基礎知識彙總系列(三)

1.Java建立物件的幾種方式

(1)使用new關鍵字(呼叫構造方法);

(2)使用Class類的newInstance方法(呼叫構造方法);

(3)使用Constructor類的newInstance方法(呼叫構造方法);

(4)使用clone方法(不呼叫構造方法);

(5)使用物件反序列化方法(不呼叫構造方法);

2.抽象類和介面的區別

抽象類:

抽象類不能建立例項物件;

含有抽象方法的方法的類必須定義為抽象類;

抽象類中的方法不一定為抽象方法;

抽象類中定義的抽象方法必須在子類中實現,所以不能有抽象構造方法和抽象靜態方法;

如果子類中沒有實現抽象父類的所有抽象方法,則該子類也要宣告為抽象類;

抽象類與介面的區別:

(1)抽象類可以有構造方法,介面中不能存在構造方法;

(2)抽象類中可以有普通成員變數、常量、靜態變數,介面中只有常量(預設修飾符為public static final);

(3)抽象類中可以有普通方法,抽象方法,靜態方法,而介面中只含有抽象方法(預設修飾符為public abstract);

(4)抽象類中的抽象方法的訪問修飾符可以是public和protected,而介面中的抽象方法訪問修飾符只能是public;

(5)一個類可以實現多個介面,但只能繼承一個抽象類;

3.Java泛型的概念,好處及各JDK版本之間的區別

泛型是JDK1.5引入的,其本質是引數化型別,這種引數型別可以用在類,方法,介面的建立中,分別稱為泛型類,泛型方法,泛型介面;

泛型的好處在於編譯時檢查型別安全,並且所有的強制轉換都是自動的和隱式的,提高了程式碼重用率,避免在執行時出現ClassCastException;

JDK1.5引入了泛型在編譯時進行型別檢查,JDK1.7泛型則具備了自動推斷能力,例:

JDK1.5寫法

List<String> list = new ArrayList<String>();

JDK1.7寫法

List<String> list = new ArrayList<>();

 4.型別擦除的概念

泛型是通過型別擦除來實現的,泛型擦除具體來說就是在編譯成位元組碼時首先進行型別檢查,接著進行型別擦除,接著如果型別擦除和多型性發生衝突時就在子類中生成橋方法解決,接著如果呼叫泛型方法的返回型別被擦除則在呼叫該方法時插入強制型別轉換。

5.Java中的限定萬用字元與非限定萬用字元

限定萬用字元對泛型型別進行限制,泛型中有兩種限定萬用字元,一種是 <? extends T> 來保證泛型型別必須是 T 的子類來設定泛型型別的上邊界,另一種是 <? super T> 來保證泛型型別必須是 T 的父類來設定型別的下邊界,泛型型別必須用限定內的型別來進行初始化,否則會導致編譯錯誤。

非限定萬用字元 <?> 表示可以用任意泛型型別來替代,可以在某種意義上來說是泛型向上轉型的語法格式,因為 List<String> 與 List<Object> 不存在繼承關係。

6.List<Object>與List原始型別之間的區別

(1)原始型別和帶泛型引數型別 <Object> 之間的主要區別是在編譯時編譯器不會對原始型別進行型別安全檢查,卻會對帶引數的型別進行檢查,通過使用 Object 作為型別可以告知編譯器該方法可以接受任何型別的物件(比如 String 或 Integer)。

(2)我們可以把任何帶引數的型別傳遞給原始型別 List,但卻不能把 List<String> 傳遞給接受 List<Object> 的方法,因為會產生編譯錯誤。