與面向對象的多態性相類似,應用泛型可以提高程序的復用性。與多態性不同的是,應用泛型可以減少數據的類型轉換,從而提高代碼的運行效率。泛型實際上是通過給類或接口增加類型參數實現的。不帶泛型的類的定義格式是:
【類型修飾詞列表】 class 類名 【extends 父類名】 【implements 接口名稱列表】
{
類體
}
如果需要將上面的類定義格式改為具有泛型特點的類定義格式,則只需要將其中緊接在關鍵字class之後的類名修改為:
類名 <類型參數>
或者是
類名 <類型參數1,類型參數2,類型參數3,......,類型參數n>
前者適用於只有1個類型參數;後者適用於多個類型參數,在相鄰參數之間采用逗號隔開。上面的方法同樣適用於接口,從而將不帶泛型的接口定義格式修改為具有泛型特點的接口定義格式。
類型參數的定義格式可以采用下面3種形式的任何一種:
(1)類型參數標識符
(2)類型參數標識符 extends 父類型
(3)類型參數標識符 extends 父類型1 & 父類型2 & 父類型3 &......&父類型n
下面來看一個有關第三種形式的實例:
//定義類J_C1 class J_C1 { public void mb_methodA() { System.out.print("A"); } } //定義接口J_C2 interface J_C2 { public void mb_methodB(); } //定義類J_C3,其繼承J_C1類,實現接口J_C2 class J_C3 extends J_C1 implements J_C2 { public void mb_methodB() { System.out.print("B"); } } //定義J_T類,其繼承類J_C1和接口J_C2 class J_T <T extends J_C1 & J_C2> { public void mb_method(T t) { t.mb_methodA(); t.mb_methodB(); } } //實際調用J_T類 public class J_Genericity { public static void main(String args[]) { J_T<J_T3> a = new J_T<J_T3>(); a.mb_methodT(new J_C3()); } }
上述代碼最後執行的結果為:AB
在類J_T的類體中,如果某個變量的類型為類型T,則可以通過該變量調用類J_C1的成員方法或接口J_C2的成員方法。在上面的例子中,因為類J_C3實現了接口J_C2,並且是類J_C1的子類,所以類J_C3具有類型J_C1和J_C2的所有能力。因此,可以用類J_C3當作類J_T的類型變量T的實際類型,例如:類型J_T<J_C3>。
創建枚舉類型的主要目的是為了定義一些枚舉常量。枚舉的基本定義格式是:
【枚舉類型修飾詞列表】 enum 枚舉類型標識符
{
枚舉常量1,枚舉常量2,......,枚舉常量n
}
其中,“【】”表示枚舉類型修飾詞列表是可選項;枚舉類型修飾詞列表用來說明所定義的枚舉類型的屬性,可以包含0個、1個或多個枚舉類型修飾詞。如果包含多個枚舉類型修飾詞沒,則在相鄰的枚舉類型修飾詞之間采用空格分隔開。枚舉類型修飾詞可以是public等,但不能是protected、private、abstract。如果枚舉類型修飾詞含有public,則要求該枚舉定義所在的文件名前綴與枚舉類型標識符指定的名稱相同,並且以“.java”作為後綴。而且在該文件中不能含有其他屬性為public的類、接口或枚舉。每個Java源程序文件含有多個類、接口或枚舉,但其中屬性為public的只能有0個或者1個。枚舉類型修飾詞public表明該枚舉能夠被各個軟件包的所有類或接口訪問。如果在枚舉類型修飾詞中不含public,則表明該枚舉類型的封裝性為默認方式,只能在同一個包內部使用。枚舉類型標識符以及枚舉常量1、枚舉常量2、......、枚舉常量n定義了一些枚舉常量。
枚舉類型變量簡稱為枚舉變量,其定義格式有兩種,分別是:
枚舉類型標識符 枚舉變量;
枚舉類型標識符 枚舉變量1,枚舉變量2,......,枚舉變量n;
例如,以下定義了四個枚舉常量:
Enum E_SEASON
{
春季,夏季,秋季,冬季
} //枚舉E_SEASON結束
那麼該如何定義枚舉變量呢?可以參照上述枚舉變量兩種定義格式,具體如下:
E_SEASON s;
E_SEASON s1,s2,s3,......,sn;
除了以上兩種方式定期枚舉變量之外,還可以定義枚舉數組變量,其定義格式與其它類型數組變量定義格式相同。例如:
E_SEASON [] s;
除此之外,還要注意的是,對於枚舉類型,不能通過new運算符創建實例對象。可以直接通過枚舉類型標識符訪問枚舉常量。例如:
E_SEASON s = E_SEASON.春季;
此外定義的枚舉變量也可以訪問枚舉常量,例如:
s.夏季 == E_SEASON.夏季;
最後,需要注意的是使用兩個成員方法:
(1)public String name()
(2)Public String toString()
這兩個方法的功能是相同的,都是返回枚舉常量所對應的字符串。例如,假設s變量已經被賦值為“春季”,那麼調用方法結果:
S.name()和E_SEASON.春季.toString()均返回字符串“春季”