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

下载本文档

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

文档简介

Java程序设计,第八章泛型、枚举和内部类,学习目标,理解泛型的作用,掌握泛型类的声明及实例化的方法掌握枚举类的定义和使用掌握内部类的定义和使用方法掌握匿名类的使用方法,8.1泛型,什么是泛型泛型也被称为参数化类型(parameterizedtype),就是在定义类、接口和方法时,规定了创建将要处理的对象类型。声明泛型类要求,一个实现先进先出的循环队列。怎么实现这样的数据结构?要处理的队列元素类型是什么?,实现策略一:非泛型的方法,/程序8-1:一个实现了先进先出的循环队列publicclassPoolprivateObjectobjArray;/记录当前数组中第一个元素出现的位置privateintheadLoc/记录当前数组中最后一次插入元素位置privateinttailLoc;publicPool(intlength)objArray=newObjectlength;headLoc=-1;/默认在第一个元素之前tailLoc=-1;/默认在第一个元素之前,/从数组中取得一个元素,如果没有返回nullpublicObjectget()Objectresult=null;intidx=(headLoc+1)%objArray.length;/指针后移一位if(objArrayidx!=null)result=objArrayidx;objArrayidx=null;headLoc+;/更新队列头的位置returnresult;,实现策略二:泛型的方法,/*程序8-2:一个利用泛型实现了先进先出的循环队列,T是未知类型*/publicclassGenericPoolprivateObjectobjArray;privateintheadLoc;/记录第一个元素出现的位置privateinttailLoc;/记录最后一次插入元素位置publicGenericPool(intlength)objArray=newObject10;headLoc=-1;/默认在第一个元素之前tailLoc=-1;/默认在第一个元素之前,/*从数组中取得一个元素,如果没有返回null,方法的返回值类型为T,这里和类的未知参数一致*/publicTget()Objectresult=null;intidx=(headLoc+1)%objArray.length;/指针后移一位if(objArrayidx!=null)result=objArrayidx;objArrayidx=null;headLoc+;return(T)result;,8.1.2声明泛型接口,声明,publicinterfaceIPoolTget();intadd(Tt);,实现,publicclassGenericPoolimplementsIPool,publicclassGenericPoolimplementsIPool,8.1.3声明泛型方法,泛型方法除了泛型类和接口外,还可以只单独定义一个方法作为泛型方法,可以指定方法参数或者返回值指定为泛型类型的声明,留待运行时确定泛型方法就可以声明在泛型类中,也可以声明在普通类中。,publicclassArrayToolpublicstaticvoidinsert(Ee,intidx)/请自己添加代码publicstaticEvalueAt(Ee)/请自己添加代码,8.1.4泛型参数的限定,定义泛型参数的上界,publicclassNumberGenericPool,说明上述方式的声明规定了NumberGenericPool类所能处理的参数其类型和Number有继承关系extends关键字所声明的上界既可以是一个类,也可以是一个接口当泛型参数这样声明时,在实例化一个泛型类时,需要明确类型必须为指定上界类型或者子类。,NumberGenericPoolpool=newNumberGenericPool(2);,8.1.4泛型参数的限定,定义参数的下界,Listcards=newArrayList();,说明通过使用super关键字可以固定泛型参数的类型为某种类型或者其超类当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符,publicstaticvoidsort(Ta,Comparatorc),通配符“?”符号表明参数的类型可以是任何一种类型,他和参数T的含义是有区别的。T表示一种未知类型,而“?”表示任何一种类型。这种通配符一般有以下三种用法:单独的?,用于表示任何类型。?extendstype,表示带有上界。?supertype,表示带有下界。,8.2枚举,如果我们想定义一个成绩类,成绩的范围只能是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;,8.3内部类,内部类的声明和应用内部类的使用通常出现在一个类只为另一个类提供单独的服务。,/程序8-3:一个内部类的定义publicclassOuterClassprivateStringname;privateStringstate;publicOuterClass(Stringname,Stringstate)super();=name;this.state=state;privatevoidsay()System.out.println(外部:+name+的状态是+state);publicclassInnerClasspublicvoidalarm()System.out.println(内部:+name+的状态是+state);say();,由于内部类存在于外部类内,因此他了解外部类的一切构成细节,因此,可以根据需要使用外部类的属性、方法,即使他们可能是用private修饰的。,/程序8-3:一个内部类的定义publicclassOuterClass。publicstaticvoidmain(Stringargs)OuterClassouter=newOuterClass(冰箱,完好);OuterClass.InnerClassinner=outer.newInnerClass();inner.alarm();,使用内部类的一些用法内部类在作用上如同一个类定义的属性一样,但差异在于内部类同样可以在外部类中直接作为类型出现,用于声明外部类的属性类型,方法的参数或返回值类型。由于InnerClass是OuterClass的内部类,因此,在需要创建一个InnerClass的实例时,需要通过一个OuterClass的实例来创建,如上面的语句中在new运算符前添加了outer实例名,当然如果在OuterClass内的方法中创建InnerClass的实例时,是不需要这个前缀的。有了一个内部类实例,通过使用变量名可以引用可用的方法和属性,8.3.2具有static修饰的内部类,publicclassOuterClass2privateStringname;privateStringstate;publicOuterClass2(Stringname,Stringstate)super();=name;this.state=state;privatevoidsay()System.out.println(外部:+name+的状态是+state);staticclassInnerClasspublicvoidalarm()System.out.println(static内部类无法使用OuterClass+的非static修饰的属性和方法);,OuterClass.InnerClassinner=newOuterClass.InnerClass();,8.3.3局部内部类,局部内部类一个内部类可以被声明在一个方法内部,这样的类被称为局部内部类。局部内部类不能被声明为public、protected和private,只能被abstract和final来修饰,他可以引用外部类的属性和方法,但只能引用包含它的方法中final类型的局部变量。,8.3.4匿名内部类,顾名思义,匿名内部类就是没有名字的类。例如:Arrays.sort()方法,其方法要求一个是个比

温馨提示

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

评论

0/150

提交评论