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

下载本文档

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

文档简介

Java程序设计 第四章 范型和枚举 4.4 范型 n范型的一个作用: u如果我们需要安全的保证一个处理器其处理的对 象只能是指定类型的对象,那么范型就可以发挥 作用。 n一个范型的例子 uSet myObjSet = new HashSet(); 4.4.1 什么是范型? n范型也被称为参数化类型(parameterized type),就是在定义类和接口时,规定了创建该 类对象时需要的一个或多个类型参数(注意: 并非构造函数的参数)。 uclass HashMap u . u Value put(Key k, Value v) . u Value get(Key k) . u n其类型名用key和value临时表示就容易理解了 ,其真正的类型只有到运行时才能完全确定。 一个不用范型的例子 nimport java.util.*; npublic class OldStyle upublic static void main(String args) uHashSet myObjSet = new HashSet(); / 创建一个集合,存放 对象 umyObjSet.add(new Integer(0); / 向集合中增加一个整型对 象 umyObjSet.add(new Integer(1); / umyObjSet.add(new Double(2); / 向集合中增加一个实型对象 uObject x = null; ufor (Iterator it = myObjSet.iterator(); it.hasNext();) ux = it.next(); / 获得下一个对象 uif (x instanceof Integer) /如果x是整型类型 u System.out.printf(“%d”,(Integer) x);/ 强制转换的对象 类型为整型 uelse if (x instanceof Double) /如果x是实型类型 u System.out.printf(“%f”,(Double)x);/ 强制转换对象类型 为实型 u u u n 一个应用范型的程序 nimport java.util.HashSet; nimport java.util.Iterator; npublic class NewStyle upublic static void main(String args) u/ 创建一个集合,存放整型对象 uHashSet myObjSet = new HashSet(); umyObjSet.add(new Integer(0); / 向集合中增加一个整 型对象 umyObjSet.add(new Integer(1); / umyObjSet.add(new Integer(2); / ufor (Integer x : myObjSet) uSystem.out.println(x); u u n 两个程序的差异 n创建集合对象的方法变了,由原来的 uHashSet myObjSet = new HashSet() uHashSet myObjSet = new HashSet()。 u这是一个重要的变化,它声明集合只容纳整型对象。 n访问集合的方法得到了简化,可以放心的直接使用 从集合中获得的每个对象。 n当然,限制了集合中包含的元素类型。对于特殊情 况下希望集合中存放某几种特别类型的对象(如具 有派生关系)时可能会有不便,这个问题可以用特 殊的范型定义来解决。 4.4.2 范型声明 n1 类型变量 u通过前面的程序我们已经看到,通过将一个集合 在声明时事先指定容纳的类型,如: uHashSet myObjSet = new HashSet(); 4.4.2 范型声明(cont.) n2 范型类的定义 uReadingRoom.java示例程序。 n如何使用ReadingRoom类? uReadingRoom bookRoom= new ReadingRoom (); 4.4.2 范型声明(cont.) n在范型定义中,也可以限制T这种未知类型的 范围,如ReadingRoom, 这里限制了T的父类是Media。这里需要注意 以下几点: u类的类型参数声明紧跟在类名之后,其个数 可以有多个,如ReadingRoom。 u类声明时的类型参数在对象内可以直接被作 为一种类型来使用,参见下面的多态方法。 u类型参数在创建该类的实例时,需要用明确 的类型来代替。 4.4.2 范型声明(cont.) n3 多态方法 u范型Java编程用语中,用类型进行参数化的方法 被称为多态方法(Polymorphic method)。 上面 的程序在以下几个地方都用到了范型的定义。 upublic void add(T t) 方法声明中的参数类型 upublic T getFirst() 方法返回值类型 多态方法 的示例 npublic class MathUtils upublic static Number max( T1 x, T2 y ) u return x.doubleValue()y.doubleValue()?x:y; u upublic static void main(String args) u Number t; u t=MathUtils.max(10.1f,9.1d); u System.out.println(t); u n 何处声明类型参数 n类声明时定义,如果该范型类型需要在类和对象内 部使用,就要在类的声明时附加类的参数信息,如 同ReadingRoom声明的那样: upublic class ReadingRoom u这里的T作为类型参数在整个类内部都可以作为一 个未知类型被引用。 n方法声明时定义,如果仅在一个方法内使用,就可 以在方法声明时添加此参数类型声明,如同下面语 句: upublic static T max( T x, T y ) public class ReadingRoom List mediaList; /只能接受类型为T的对象到列表集合 public ReadingRoom () /构造函数 this.mediaList = new ArrayList(); /这里的T和上面的参数T 也一致 public void add(T t) /将一个类型为T的对象增加到列表集合 this.mediaList.add(t); public T getFirst() T retuval=null; /定义了返回值,其类型为T Iterator it=this.mediaList.iterator(); /获得了列表的迭代器 if(it.hasNext() /hasNext()逻辑值,如果还有对象,返回true retuval=it.next(); /迭代器下移,获得对象,对象类型为T return retuval; /返回值 4.4.3 类型参数通配符 n在一些情况下,我们可能并不关心未定的参数类型是 什么,例如,对一个包含了数值元素的集合进行汇总 运算,这种情况下,我们并不关心集合中的每一个对 象是什么类型,只要它是数值型即可,而且,我们也 希望集合中可以同时存放不同类型的数值类型,如整 型、实型等,那又该如何做呢 ?答案就是采用参数通 配符“?”来解决这个问题。 upublic double sumList(List values) n一个程序例子:TestWildcard.java public class TestWildcard /方法的参数是用范型类型声明的。 public double sumList(List list) double total = 0.0; for(Number o : list) total += o.doubleValue(); return total; public static void main(String args) List sample=new ArrayList(); sample.add(new Integer(1);/向集合增加一整型对象 sample.add(new Double(2); /向集合增加一双精度对象 sample.add(new Float(3); /向集合增加一单精度对象 TestWildcard test = new TestWildcard(); System.out.println(test.sumList(sample); 4.5 枚举类 n如果我们想定义一个成绩类,成绩的范围只 能是A、B、C、D、E,接受其它类型的值都是 违法的,应该如何定义呢?我们可以定义一 个成绩类,但如何表示成绩呢,整型、字符 型?似乎都不合适,因为没有明确的类型对 应,即使是字符型,那么超出了“A、B、C、D 、E“范围的字符程序需要特别处理,以便保 证应用安全。Java语言提供了一种称为枚举 的类型定义方法. n1 声明枚举类 upublic enum Grade A, u B, u C, u D, u E ; n 它包括一个关键字enum,一个新枚举类型的名 字 Grade以及为Grade定义的一组值,这里的值 既非整型,亦非字符型。 n枚举类是一个类,它的隐含父类是 java.lang.Enum。 n枚举值并不是整数或其它类型,是被声明的枚举 类的自身实例,例如A是Grade的一个实例。 n枚举类不能有public修饰的构造函数,构造函数 都是隐含private,编译器自动处理。 n每个枚举值隐含都是由public、static、final 修饰的,无须自己添加这些修饰符。 n枚举值可以用“=“ 或 “equals( )“ 进行彼此相 等比较。 一个枚举的例子 n第一个类文件Grade.java npublic enum Grade n A, n B, n C, n D, n E n n第二个类文件AcademicRecord.java n第三个类文件Student.java n3 使用switch判断 uswitch (student.getGrade( ) u case A: u u break; u case B: u u break; u case C: u u break; u case D: u u break; u case E: u u break; u n4. 为枚举类增加构造函数 nenum Size uSmall(0.8), /Small的

温馨提示

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

评论

0/150

提交评论