Java程序设计-4-范型和枚举.ppt

上传人:本田雅阁 文档编号:2201828 上传时间:2019-03-03 格式:PPT 页数:21 大小:217.51KB
返回 下载 相关 举报
Java程序设计-4-范型和枚举.ppt_第1页
第1页 / 共21页
Java程序设计-4-范型和枚举.ppt_第2页
第2页 / 共21页
Java程序设计-4-范型和枚举.ppt_第3页
第3页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java程序设计-4-范型和枚举.ppt》由会员分享,可在线阅读,更多相关《Java程序设计-4-范型和枚举.ppt(21页珍藏版)》请在三一文库上搜索。

1、Java程序设计,第四章 范型和枚举,4.4 范型,范型的一个作用: 如果我们需要安全的保证一个处理器其处理的对象只能是指定类型的对象,那么范型就可以发挥作用。 一个范型的例子 Set myObjSet = new HashSet();,4.4.1 什么是范型?,范型也被称为参数化类型(parameterized type),就是在定义类和接口时,规定了创建该类对象时需要的一个或多个类型参数(注意:并非构造函数的参数)。 class HashMap . Value put(Key k, Value v) . Value get(Key k) . 其类型名用key和value临时表示就容易理解了

2、,其真正的类型只有到运行时才能完全确定。,一个不用范型的例子,import java.util.*; public class OldStyle public static void main(String args) HashSet myObjSet = new HashSet(); / 创建一个集合,存放对象 myObjSet.add(new Integer(0); / 向集合中增加一个整型对象 myObjSet.add(new Integer(1); / myObjSet.add(new Double(2); / 向集合中增加一个实型对象 Object x = null; for (It

3、erator it = myObjSet.iterator(); it.hasNext();) x = it.next(); / 获得下一个对象 if (x instanceof Integer) /如果x是整型类型 System.out.printf(“%d”,(Integer) x);/ 强制转换的对象类型为整型 else if (x instanceof Double) /如果x是实型类型 System.out.printf(“%f”,(Double)x);/ 强制转换对象类型为实型 ,一个应用范型的程序,import java.util.HashSet; import java.uti

4、l.Iterator; public class NewStyle public static void main(String args) / 创建一个集合,存放整型对象 HashSet myObjSet = new HashSet(); myObjSet.add(new Integer(0); / 向集合中增加一个整型对象 myObjSet.add(new Integer(1); / myObjSet.add(new Integer(2); / for (Integer x : myObjSet) System.out.println(x); ,两个程序的差异,创建集合对象的方法变了,由原

5、来的 HashSet myObjSet = new HashSet() HashSet myObjSet = new HashSet()。 这是一个重要的变化,它声明集合只容纳整型对象。 访问集合的方法得到了简化,可以放心的直接使用从集合中获得的每个对象。 当然,限制了集合中包含的元素类型。对于特殊情况下希望集合中存放某几种特别类型的对象(如具有派生关系)时可能会有不便,这个问题可以用特殊的范型定义来解决。,4.4.2 范型声明,1 类型变量 通过前面的程序我们已经看到,通过将一个集合在声明时事先指定容纳的类型,如: HashSet myObjSet = new HashSet();,4.4.

6、2 范型声明(cont.),2 范型类的定义 ReadingRoom.java 示例程序。 如何使用ReadingRoom类? ReadingRoom bookRoom= new ReadingRoom ();,4.4.2 范型声明(cont.),在范型定义中,也可以限制T这种未知类型的范围,如ReadingRoom,这里限制了T的父类是Media。这里需要注意以下几点: 类的类型参数声明紧跟在类名之后,其个数可以有多个,如ReadingRoom。 类声明时的类型参数在对象内可以直接被作为一种类型来使用,参见下面的多态方法。 类型参数在创建该类的实例时,需要用明确的类型来代替。,4.4.2 范

7、型声明(cont.),3 多态方法 范型Java编程用语中,用类型进行参数化的方法被称为多态方法(Polymorphic method)。 上面的程序在以下几个地方都用到了范型的定义。 public void add(T t) 方法声明中的参数类型 public T getFirst() 方法返回值类型,多态方法 的示例,public class MathUtils public static Number max( T1 x, T2 y ) return x.doubleValue()y.doubleValue()?x:y; public static void main(String ar

8、gs) Number t; t=MathUtils.max(10.1f,9.1d); System.out.println(t); ,何处声明类型参数,类声明时定义,如果该范型类型需要在类和对象内部使用,就要在类的声明时附加类的参数信息,如同ReadingRoom声明的那样: public class ReadingRoom 这里的T作为类型参数在整个类内部都可以作为一个未知类型被引用。 方法声明时定义,如果仅在一个方法内使用,就可以在方法声明时添加此参数类型声明,如同下面语句: public static T max( T x, T y ),public class ReadingRoom

9、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(

10、)逻辑值,如果还有对象,返回true retuval=it.next(); /迭代器下移,获得对象,对象类型为T return retuval; /返回值 ,4.4.3 类型参数通配符,在一些情况下,我们可能并不关心未定的参数类型是什么,例如,对一个包含了数值元素的集合进行汇总运算,这种情况下,我们并不关心集合中的每一个对象是什么类型,只要它是数值型即可,而且,我们也希望集合中可以同时存放不同类型的数值类型,如整型、实型等,那又该如何做呢 ?答案就是采用参数通配符“?”来解决这个问题。 public double sumList(List values) 一个程序例子:TestWildcard

11、.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); /向集合增加一

12、双精度对象 sample.add(new Float(3); /向集合增加一单精度对象 TestWildcard test = new TestWildcard(); System.out.println(test.sumList(sample); ,4.5 枚举类,如果我们想定义一个成绩类,成绩的范围只能是A、B、C、D、E,接受其它类型的值都是违法的,应该如何定义呢?我们可以定义一个成绩类,但如何表示成绩呢,整型、字符型?似乎都不合适,因为没有明确的类型对应,即使是字符型,那么超出了“A、B、C、D、E“范围的字符程序需要特别处理,以便保证应用安全。Java语言提供了一种称为枚举的类型定义

13、方法.,1 声明枚举类 public enum Grade A, B, C, D, E ; 它包括一个关键字enum,一个新枚举类型的名字 Grade以及为Grade定义的一组值,这里的值既非整型,亦非字符型。,枚举类是一个类,它的隐含父类是java.lang.Enum。 枚举值并不是整数或其它类型,是被声明的枚举类的自身实例,例如A是Grade的一个实例。 枚举类不能有public修饰的构造函数,构造函数都是隐含private,编译器自动处理。 每个枚举值隐含都是由public、static、final修饰的,无须自己添加这些修饰符。 枚举值可以用“=“ 或 “equals( )“ 进行彼此

14、相等比较。,一个枚举的例子,第一个类文件Grade.java public enum Grade A, B, C, D, E 第二个类文件AcademicRecord.java 第三个类文件Student.java,3 使用switch判断 switch (student.getGrade( ) case A: break; case B: break; case C: break; case D: break; case E: break; ,4. 为枚举类增加构造函数 enum Size Small(0.8), /Small的类型为Size,而Size有指定的构造函数 Medium(1.0), Large(1.2); /分号表示枚举值定义结束 private double pricingFactor; /构造函数,如Small(0.8), pricingFactor=0.8 Size(double p) pricingFactor = p; public double getPricingFactor() return pricingFactor; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1