1. 程式人生 > >17.列舉型別與泛型

17.列舉型別與泛型

我這些學習筆記,記錄的都是我自己認為的知識點,可能以後再看的時候還要翻書,但是可以用來定位到準確的書中示例的位置,減少翻書重找的時間,利於自身知識體系的搭建。                   self-transcendence

第17章 列舉型別與泛型

17.1 列舉型別

使用列舉型別可以取代以往定義常量的方式,並且還有程式在編譯時進行檢查的功能。

17.1.1 使用列舉型別設定常量

以往設定常量,通常將常量放置在介面中,這樣在程式中就可以直接使用,並且該常量不能被修改,因為在介面中定義常量時,該常量的修飾符為finalstatic

使用列舉型別定義常量的語法如下:

Public enum Constants{

Constants_A,

Constants_B,

Constants_C

}

enum是定義列舉類的關鍵字。程式中使用常量,用Constants.Constants_A來引用。

17.1.2 深入瞭解列舉型別

每一個列舉類都可以看做是一個類,當定義一個列舉型別時,每一個成員都可以看做一個列舉例項,這些成員都預設被final public static修飾,所以直接使用列舉型別名稱嗲用列舉型別成員就行。

方法名稱

具體含義

使用方法

values()

該方法可以將列舉型別成員以陣列的形式返回

列舉名.values

valueOf()

該方法可以實現將普通字串轉換為列舉例項

列舉名.valueOf(“abc”)

compareTo()

該方法用於比較兩個列舉物件在定義時的順序

列舉名.compareTo

ordinal()

該方法用於得到列舉成員的位置索引

列舉名.ordinal

呼叫compareTo方法返回的結果,正值代表方法中引數在呼叫該方法的列舉物件位置之前;0代表兩個互相比較的列舉成員的位置相同;負值代表方法中引數在呼叫該方法的列舉物件位置之後。

-------------------------------------------------------------------

17.2 泛型

泛型實質上就是使程式設計師定義安全的型別。在沒有出現泛型之前,java也提供了對Object的引用“任意化”操作,這種“任意化”操作就是對

Object引用進行向下轉型及向上轉型操作,但某些強制型別轉換的錯誤也許不會被編譯器捕捉,而在執行後出現異常,可見強制型別轉換存在安全隱患,所以提供了泛型機制。

Object類為最上層的父類,很多程式設計師為了使程式更為通用,設計程式時通常使傳入的值與返回的值都以Object型別為主。當需要使用這些例項時,必須正確地將該例項轉換為原來的型別,否則就會發生異常。語法是 類名<T>

在定義泛型時,還可以宣告多個型別:

MutiOverClass<T1,T2>

MutiOverClass:泛型類名稱

這樣例項化指定型別的物件時就可以指定多個型別:

MutiOverClass<Boolean,Float> aaa=new MutiOverClass<Boolean,Float>();

定義泛型類時也可以宣告陣列型別:

Public T[] getT(){};

Javaq中已經被泛型化的集合框架:

ArrayList<E>  HashMap<K,V>  HashSet<E>  Vector<E>

泛型的高階用法包括限制泛型可用型別和使用型別萬用字元等。

預設可以使用任何型別來例項化一個泛型類物件,但java中也對泛型類例項的型別做了限制,語法是:class 類名稱<T extends anyClass> anyClass指某個介面或類。

使用泛型限制後,泛型類的型別必須實現或繼承了anyClass這個介面或類。無論anyClass是介面還是類,在進行泛型限制時,都必須使用extends關鍵字。

型別萬用字元,主要作用是建立一個泛型物件時,限制這個泛型類的型別實現,或者繼承某個介面或類的子類。要宣告這樣一個物件可以使用“?”萬用字元來表示,同時使用extends關鍵字來對泛型加以限制。語法是:泛型類名稱<? extends List> a=null

其中,<? exteand List>表示型別未知,當需要使用該泛型物件時,可以單獨例項化。

泛型類和泛型介面可以被繼承和實現。