1、泛型
与面向对象的多态性相类似,应用泛型可以提高程序的复用性。与多态性不同的是,应用泛型可以减少数据的类型转换,从而提高代码的运行效率。泛型实际上是通过给类或接口增加类型参数实现的。不带泛型的类的定义格式是:
【类型修饰词列表】 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>。
2、枚举
创建枚举类型的主要目的是为了定义一些枚举常量。枚举的基本定义格式是:
【枚举类型修饰词列表】 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()均返回字符串“春季”