全国咨询/投诉热线:400-618-4000

jdk1.5的新特性(下)

更新时间:2018年10月24日16时09分 来源:传智播客 浏览次数:

  (5)枚举

  **为什么要有枚举?

  问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,

  但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

  枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。

  枚举可以让编译器在编译时就可以控制源程序中填写的非法值,

  普通变量的方式在开发阶段无法实现这一目标。

  **用普通类如何实现枚举的功能?定义一个Weekday类来模拟实现:

  步骤:

  *私有化构造方法

  *每个元素分别用一个公有的静态成员变量表示(publicstatic final)

  *可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句

  转移成了一个个独立的类。

  **枚举的应用:

  举例:定义一个Weekday的枚举。

  扩展:枚举类的values,valueOf,name,toString,ordinal等方法

  (记住,讲课时要先于自定义方法前介绍,讲课更流畅)

  总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。

  例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

  **枚举的高级应用:

  **枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

  **枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。

  把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

  **带构造方法的枚举

  构造方法必须定义成私有的

  如果有多个构造方法,该如何选择哪个构造方法?

  枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

  **带方法的枚举

  定义枚举TrafficLamp

  实现普通的next方法

  实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,

  这些子类采用类似内部类的方式进行定义。增加上表示时间的构造方法

  **枚举只有一个成员时,就可以作为一种单例的实现方式。

  (6)泛型:

  **泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,

  编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,

  对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。

  由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,

  就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。

  **ArrayList类定义和ArrayList类引用中涉及如下术语:

  整个称为ArrayList泛型类型

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

  整个ArrayList称为参数化的类型

  ArrayList中的Integer称为类型参数的实例或实际类型参数

  ArrayList中的<>念着typeof

  ArrayList称为原始类型

  **参数化类型与原始类型的兼容性:

  参数化类型可以引用一个原始类型的对象,编译报告警告,

  例如,

  Collection c = new Vector();//可不可以,不就是编译器一句话的事吗?

  原始类型可以引用一个参数化类型的对象,编译报告警告,

  例如,

  Collection c = new Vector();//原来的方法接受一个集合参数,新的类型也要能传进去

  **参数化类型不考虑类型参数的继承关系:

  Vector v = new Vector (); //错误!///不写没错,写了就是明知故犯

  Vector v = new Vector(); //也错误!

  编译器不允许创建泛型变量的数组。即在创建数组实例时,

  数组的元素不能使用参数化的类型,

  例如,下面语句有错误:

  Vector vectorList[] = new Vector[10];

  **泛型限定:

  **限定通配符的上边界:

  正确:Vectorx =new Vector();

  错误:Vectorx =new Vector();

  **限定通配符的下边界:

  正确:Vectorx =new Vector();

  错误:Vectorx =new Vector();

  **提示:

  限定通配符总是包括自己。

  ?只能用作引用,不能用它去给其他变量赋值

  Vectory = new Vector();

  Vector x = y;

  上面的代码错误,原理与Vector x11 = newVector();相似,

  只能通过强制类型转换方式来赋值。



作者:传智播客JavaEE培训学院
首发:http://java.itcast.cn/

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校区

    14天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    8天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    0天免费试学

    基础班入门课程限时免费

    申请试学名额

    12天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    10天免费试学

    基础班入门课程限时免费

    申请试学名额