Java程序设计范型和枚举.ppt_第1页
Java程序设计范型和枚举.ppt_第2页
Java程序设计范型和枚举.ppt_第3页
Java程序设计范型和枚举.ppt_第4页
Java程序设计范型和枚举.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序设计 第四章范型和枚举 4 4范型 范型的一个作用 如果我们需要安全的保证一个处理器其处理的对象只能是指定类型的对象 那么范型就可以发挥作用 一个范型的例子SetmyObjSet newHashSet 4 4 1什么是范型 范型也被称为参数化类型 parameterizedtype 就是在定义类和接口时 规定了创建该类对象时需要的一个或多个类型参数 注意 并非构造函数的参数 classHashMap Valueput Keyk Valuev Valueget Keyk 其类型名用key和value临时表示就容易理解了 其真正的类型只有到运行时才能完全确定 一个不用范型的例子 importjava util publicclassOldStyle publicstaticvoidmain String args HashSetmyObjSet newHashSet 创建一个集合 存放对象myObjSet add newInteger 0 向集合中增加一个整型对象myObjSet add newInteger 1 myObjSet add newDouble 2 向集合中增加一个实型对象Objectx null for Iteratorit myObjSet iterator it hasNext x it next 获得下一个对象if xinstanceofInteger 如果x是整型类型System out printf d Integer x 强制转换的对象类型为整型elseif xinstanceofDouble 如果x是实型类型System out printf f Double x 强制转换对象类型为实型 一个应用范型的程序 importjava util HashSet importjava util Iterator publicclassNewStyle publicstaticvoidmain String args 创建一个集合 存放整型对象HashSetmyObjSet newHashSet myObjSet add newInteger 0 向集合中增加一个整型对象myObjSet add newInteger 1 myObjSet add newInteger 2 for Integerx myObjSet System out println x 两个程序的差异 创建集合对象的方法变了 由原来的HashSetmyObjSet newHashSet HashSetmyObjSet newHashSet 这是一个重要的变化 它声明集合只容纳整型对象 访问集合的方法得到了简化 可以放心的直接使用从集合中获得的每个对象 当然 限制了集合中包含的元素类型 对于特殊情况下希望集合中存放某几种特别类型的对象 如具有派生关系 时可能会有不便 这个问题可以用特殊的范型定义来解决 4 4 2范型声明 1类型变量通过前面的程序我们已经看到 通过将一个集合在声明时事先指定容纳的类型 如 HashSetmyObjSet newHashSet 4 4 2范型声明 cont 2范型类的定义ReadingRoom java示例程序 如何使用ReadingRoom类 ReadingRoombookRoom newReadingRoom 4 4 2范型声明 cont 在范型定义中 也可以限制T这种未知类型的范围 如ReadingRoom 这里限制了T的父类是Media 这里需要注意以下几点 类的类型参数声明紧跟在类名之后 其个数可以有多个 如ReadingRoom 类声明时的类型参数在对象内可以直接被作为一种类型来使用 参见下面的多态方法 类型参数在创建该类的实例时 需要用明确的类型来代替 4 4 2范型声明 cont 3多态方法范型Java编程用语中 用类型进行参数化的方法被称为多态方法 Polymorphicmethod 上面的程序在以下几个地方都用到了范型的定义 publicvoidadd Tt 方法声明中的参数类型publicTgetFirst 方法返回值类型 多态方法的示例 publicclassMathUtils publicstaticNumbermax T1x T2y returnx doubleValue y doubleValue x y publicstaticvoidmain String args Numbert t MathUtils max 10 1f 9 1d System out println t 何处声明类型参数 类声明时定义 如果该范型类型需要在类和对象内部使用 就要在类的声明时附加类的参数信息 如同ReadingRoom声明的那样 publicclassReadingRoom这里的T作为类型参数在整个类内部都可以作为一个未知类型被引用 方法声明时定义 如果仅在一个方法内使用 就可以在方法声明时添加此参数类型声明 如同下面语句 publicstaticTmax Tx Ty publicclassReadingRoom ListmediaList 只能接受类型为T的对象到列表集合publicReadingRoom 构造函数this mediaList newArrayList 这里的T和上面的参数T也一致 publicvoidadd Tt 将一个类型为T的对象增加到列表集合this mediaList add t publicTgetFirst Tretuval null 定义了返回值 其类型为TIteratorit this mediaList iterator 获得了列表的迭代器if it hasNext hasNext 逻辑值 如果还有对象 返回trueretuval it next 迭代器下移 获得对象 对象类型为T returnretuval 返回值 4 4 3类型参数通配符 在一些情况下 我们可能并不关心未定的参数类型是什么 例如 对一个包含了数值元素的集合进行汇总运算 这种情况下 我们并不关心集合中的每一个对象是什么类型 只要它是数值型即可 而且 我们也希望集合中可以同时存放不同类型的数值类型 如整型 实型等 那又该如何做呢 答案就是采用参数通配符 来解决这个问题 publicdoublesumList Listvalues 一个程序例子 TestWildcard java publicclassTestWildcard 方法的参数是用范型类型声明的 publicdoublesumList Listlist doubletotal 0 0 for Numbero list total o doubleValue returntotal publicstaticvoidmain String args Listsample newArrayList sample add newInteger 1 向集合增加一整型对象sample add newDouble 2 向集合增加一双精度对象sample add newFloat 3 向集合增加一单精度对象TestWildcardtest newTestWildcard System out println test sumList sample 4 5枚举类 如果我们想定义一个成绩类 成绩的范围只能是A B C D E 接受其它类型的值都是违法的 应该如何定义呢 我们可以定义一个成绩类 但如何表示成绩呢 整型 字符型 似乎都不合适 因为没有明确的类型对应 即使是字符型 那么超出了 A B C D E 范围的字符程序需要特别处理 以便保证应用安全 Java语言提供了一种称为枚举的类型定义方法 1声明枚举类publicenumGrade A B C D E 它包括一个关键字enum 一个新枚举类型的名字Grade以及为Grade定义的一组值 这里的值既非整型 亦非字符型 枚举类是一个类 它的隐含父类是java lang Enum 枚举值并不是整数或其它类型 是被声明的枚举类的自身实例 例如A是Grade的一个实例 枚举类不能有public修饰的构造函数 构造函数都是隐含private 编译器自动处理 每个枚举值隐含都是由public static final修饰的 无须自己添加这些修饰符 枚举值可以用 或 equals 进行彼此相等比较 一个枚举的例子 第一个类文件Grade javapublicenumGrade A B C D E 第二个类文件AcademicRecord java第三个类文件Student java 3使用switch判断switch student getGrade caseA break caseB break caseC break caseD break caseE break 4 为枚举类增加构造函数enumSize Small 0 8 Sm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论