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

上传人:max****ui 文档编号:11796290 上传时间:2020-05-02 格式:PPT 页数:21 大小:217.50KB
返回 下载 相关 举报
Java程序设计-4-范型和枚举.ppt_第1页
第1页 / 共21页
Java程序设计-4-范型和枚举.ppt_第2页
第2页 / 共21页
Java程序设计-4-范型和枚举.ppt_第3页
第3页 / 共21页
点击查看更多>>
资源描述
Java程序设计,第四章范型和枚举,4.4范型,范型的一个作用:如果我们需要安全的保证一个处理器其处理的对象只能是指定类型的对象,那么范型就可以发挥作用。一个范型的例子SetmyObjSet=newHashSet();,4.4.1什么是范型?,范型也被称为参数化类型(parameterizedtype),就是在定义类和接口时,规定了创建该类对象时需要的一个或多个类型参数(注意:并非构造函数的参数)。classHashMap.Valueput(Keyk,Valuev).Valueget(Keyk).其类型名用key和value临时表示就容易理解了,其真正的类型只有到运行时才能完全确定。,一个不用范型的例子,importjava.util.*;publicclassOldStylepublicstaticvoidmain(Stringargs)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;publicclassNewStylepublicstaticvoidmain(Stringargs)/创建一个集合,存放整型对象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()方法返回值类型,多态方法的示例,publicclassMathUtilspublicstaticNumbermax(T1x,T2y)returnx.doubleValue()y.doubleValue()?x:y;publicstaticvoidmain(Stringargs)Numbert;t=MathUtils.max(10.1f,9.1d);System.out.println(t);,何处声明类型参数,类声明时定义,如果该范型类型需要在类和对象内部使用,就要在类的声明时附加类的参数信息,如同ReadingRoom声明的那样:publicclassReadingRoom这里的T作为类型参数在整个类内部都可以作为一个未知类型被引用。方法声明时定义,如果仅在一个方法内使用,就可以在方法声明时添加此参数类型声明,如同下面语句:publicstaticTmax(Tx,Ty),publicclassReadingRoomListmediaList;/只能接受类型为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();/迭代器下移,获得对象,对象类型为Treturnretuval;/返回值,4.4.3类型参数通配符,在一些情况下,我们可能并不关心未定的参数类型是什么,例如,对一个包含了数值元素的集合进行汇总运算,这种情况下,我们并不关心集合中的每一个对象是什么类型,只要它是数值型即可,而且,我们也希望集合中可以同时存放不同类型的数值类型,如整型、实型等,那又该如何做呢?答案就是采用参数通配符“?”来解决这个问题。publicdoublesumList(Listvalues)一个程序例子:TestWildcard.java,publicclassTestWildcard/方法的参数是用范型类型声明的。publicdoublesumList(Listlist)doubletotal=0.0;for(Numbero:list)total+=o.doubleValue();returntotal;publicstaticvoidmain(Stringargs)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声明枚举类publicenumGradeA,B,C,D,E;它包括一个关键字enum,一个新枚举类型的名字Grade以及为Grade定义的一组值,这里的值既非整型,亦非字符型。,枚举类是一个类,它的隐含父类是java.lang.Enum。枚举值并不是整数或其它类型,是被声明的枚举类的自身实例,例如A是Grade的一个实例。枚举类不能有public修饰的构造函数,构造函数都是隐含private,编译器自动处理。每个枚举值隐含都是由public、static、final修饰的,无须自己添加这些修饰符。枚举值可以用=或equals()进行彼此相等比较。,一个枚举的例子,第一个类文件Grade.javapublicenumGradeA,B,C,D,E第二个类文件AcademicRecord.java第三个类文件Student.java,3使用switch判断switch(student.getGrade()caseA:break;caseB:break;caseC:break;caseD:break;caseE:break;,4.为枚举类增加构造函数enumSizeSmall(0.8),/Small的类型为Size,而Size有指定的构造函数Medium(1.0),Large(1.2);/分号表示枚举值定义结束privatedoublepricingFactor;/构造函数,如Small(0.8),pricingFactor=0.8Size(doublep)pricingFactor=p;publicdoublegetPricingFactor()returnpricingFactor;,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!