枚举类与泛型总结

来源:互联网 发布:可视化软件 编辑:程序博客网 时间:2024/05/22 00:00

JDK 5新增的 enum 关键字用于定义一个枚举类。

手动实现枚举类:

通过 private 将构造器隐藏起来

把这个类的所有可能实例都使用 public static final 修饰

属性不应允许被改动, 所以应该使用 privatefinal 修饰

枚举类和普通类的区别:

使用 enum 定义的枚举类默认继承了java.lang.Enum 类

枚举类的构造器只能使用 private 访问控制符

枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加public static final 修饰

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰

枚举类的使用 private final 修饰的属性应该在构造器中为其赋值

若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数

枚举类常用的方法

Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:

name():返回此枚举常量的名称,在其枚举声明中对其进行声明

ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

valueof(ClassenumClass, String name):返回带指定名称的指定枚举类型的枚举常量。静态方法

values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。

Public class Text{

PublicStatic void main(String[] args){

返回此枚举常量的名称,在其枚举声明中对其进行声明

String name=Grade.A.name();

System.out.println(name);

返回枚常量的序数(它在枚举声明的位置,其中初始量序数为零)。

Int index=Grade.B.ordinal();

System.out.println(index);

返回带指定名称的指定枚举类型的枚举常量。

Grade grade=Grade.valueOf(Grade.class,”A”);

System.out.println(grade.name());

此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

Grade[] grades=Grade.values();

For(Grade g:grades){
System.out.println(g.name)};

}

}
}




JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)

注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为擦除

泛形的基本术语,以ArrayList<E>为例:<>念着typeof

ArrayList<E>中的E称为类型参数变量

ArrayList<Integer>中的Integer称为实际类型参数

整个称为ArrayList<E>泛型类型

整个ArrayList<Integer>称为参数化的类型ParameterizedType

使用迭代器迭代泛形集合中的元素。

Public void test1(){

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

List.add(1);

List.add(2);

List.add(3);

Iterator<Integer> it=lis.iterator();

While(it.hasNext()){

System.out.println(it.next());

}

}

使用增强for循环迭代泛形集合中的元素。

Public void test1(){

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

List.add(1);

List.add(2);

List.add(3);

For(String str:list){

System.out.println(str);

}

存取HashMap中的元素。

Public void main test(){
Map<String,Integer> map=new HashMap<Stirng,Integer>();

Map.put(“key01”,1);

Map.put(“key02”,2);

Map.put(“key03”,3);

(“key01”,1)看成一个Map.Entry<String,Integer>

Set<Map.Entry<String,Integer>> set=map.entrySet();

Fro(Map.Entry<String,Integer>en:set){

System.out.println(en.getKey()+” ”+en.getValue());

}

}

如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:

public class GenericDao<T> {

private T field1;

public void save(T obj){}

public T getId(int id){}

}

注意

在类级别上定义的泛型,只对类的非静态成员有效

静态方法不能使用类定义的泛形,而应单独定义泛形。

泛型的高级应用——通配符

定义一个方法,接收一个集合,并打印出集合中的所有元素,如下所示:

void print (Collection<String> c) {

for (String e : c) {

System.out.println(e);

}

}

问题:该方法只能打印保存了String对象的集合,不能打印其它集合。通配符用于解决此类问题,方法的定义可改写为如下形式:

void print (Collection<?> c) {//Collection<?>(发音为:"collection of unknown")

for (Object e : c) {

System.out.println(e);

}

}

总结:使用?通配符主要用于引用对象,使用了?通配符,就只能调对象与类型无关的方法,不能调用对象与类型有关的方法。


原创粉丝点击