




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计,第八章 泛型、枚举和内部类,学习目标,理解泛型的作用,掌握泛型类的声明及实例化的方法 掌握枚举类的定义和使用 掌握内部类的定义和使用方法 掌握匿名类的使用方法,8.1泛型,什么是泛型 泛型也被称为参数化类型(parameterized type),就是在定义类、接口和方法时,规定了创建将要处理的对象类型。 声明泛型类 要求,一个实现先进先出的循环队列。 怎么实现这样的数据结构? 要处理的队列元素类型是什么?,实现策略一:非泛型的方法,/程序8-1:一个实现了先进先出的循环队列 public class Pool private Object objArray; /记录当前数组中第一个元素出现的位置 private int headLoc /记录当前数组中最后一次插入元素位置 private int tailLoc; public Pool(int length) objArray=new Objectlength; headLoc=-1;/默认在第一个元素之前 tailLoc=-1;/默认在第一个元素之前 ,/从数组中取得一个元素,如果没有返回null public Object get() Object result=null; int idx=(headLoc+1)%objArray.length;/指针后移一位 if(objArrayidx!=null) result=objArrayidx; objArrayidx=null; headLoc+;/更新队列头的位置 return result; ,实现策略二:泛型的方法,/*程序8-2:一个利用泛型实现了先进先出的循环队列, T是未知类型*/ public class GenericPool private Object objArray; private int headLoc;/记录第一个元素出现的位置 private int tailLoc;/记录最后一次插入元素位置 public GenericPool(int length) objArray=new Object10; headLoc=-1;/默认在第一个元素之前 tailLoc=-1;/默认在第一个元素之前 ,/*从数组中取得一个元素,如果没有返回null, 方法的返回值类型为T,这里和类的未知参数一致*/ public T get() Object result=null; int idx=(headLoc+1)%objArray.length;/指针后移一位 if(objArrayidx!=null) result=objArrayidx; objArrayidx=null; headLoc+; return (T)result; ,8.1.2声明泛型接口,声明,public interface IPool T get(); int add(T t); ,实现,public class GenericPool implements IPool ,public class GenericPool implements IPool ,8.1.3声明泛型方法,泛型方法 除了泛型类和接口外,还可以只单独定义一个方法作为泛型方法,可以指定方法参数或者返回值指定为泛型类型的声明,留待运行时确定 泛型方法就可以声明在泛型类中,也可以声明在普通类中。,public class ArrayTool public static void insert(E e,int idx) /请自己添加代码 public static E valueAt(E e) /请自己添加代码 ,8.1.4泛型参数的限定,定义泛型参数的上界,public class NumberGenericPool,说明 上述方式的声明规定了NumberGenericPool类所能处理的参数其类型和Number有继承关系 extends关键字所声明的上界既可以是一个类,也可以是一个接口 当泛型参数这样声明时,在实例化一个泛型类时,需要明确类型必须为指定上界类型或者子类。,NumberGenericPool pool= new NumberGenericPool(2);,8.1.4泛型参数的限定,定义参数的下界,List cards=new ArrayList();,说明 通过使用super关键字可以固定泛型参数的类型为某种类型或者其超类 当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符,public static void sort(T a, Comparator c),通配符 “?”符号表明参数的类型可以是任何一种类型,他和参数T的含义是有区别的。T表示一种未知类型,而“?”表示任何一种类型。这种通配符一般有以下三种用法: 单独的?,用于表示任何类型。 ? extends type,表示带有上界。 ? super type,表示带有下界。,8.2枚举,如果我们想定义一个成绩类,成绩的范围只能是A、B、C、D、E,接受其它类型的值都是违法的,应该如何定义呢?我们可以定义一个成绩类,但如何表示成绩呢,整型、字符型?似乎都不合适,因为没有明确的类型对应,即使是字符型,那么超出了“A、B、C、D、E“范围的字符程序需要特别处理,以便保证应用安全。Java语言提供了一种称为枚举的类型定义方法.,1 声明枚举类 public enum Grade A, B, C, D, E ; 它包括一个关键字enum,一个新枚举类型的名字 Grade以及为Grade定义的一组值,这里的值既非整型,亦非字符型。,枚举类 枚举类是一个类,它的隐含父类是java.lang.Enum。 枚举值并不是整数或其它类型,是被声明的枚举类的自身实例,例如A是Grade的一个实例。 枚举类不能有public修饰的构造函数,构造函数都是隐含private,编译器自动处理。 每个枚举值隐含都是由public、static、final修饰的,无须自己添加这些修饰符。 枚举值可以用“=“ 或 “equals( )“ 进行彼此相等比较。,一个枚举的例子,第一个类文件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; ,8.3内部类,内部类的声明和应用 内部类的使用通常出现在一个类只为另一个类提供单独的服务。,/程序8-3:一个内部类的定义 public class OuterClass private String name; private String state; public OuterClass(String name, String state) super(); = name; this.state = state; private void say() System.out.println(“外部:“ + name + “的状态是“ + state); public class InnerClass public void alarm() System.out.println(“内部:“ + name + “的状态是“ + state); say(); ,由于内部类存在于外部类内,因此他了解外部类的一切构成细节,因此,可以根据需要使用外部类的属性、方法,即使他们可能是用private修饰的。,/程序8-3:一个内部类的定义 public class OuterClass 。 public static void main(String args) OuterClass outer = new OuterClass(“冰箱“, “完好“); OuterClass.InnerClass inner = outer.new InnerClass(); inner.alarm(); ,使用内部类的一些用法 内部类在作用上如同一个类定义的属性一样,但差异在于内部类同样可以在外部类中直接作为类型出现,用于声明外部类的属性类型,方法的参数或返回值类型。 由于InnerClass是OuterClass的内部类,因此,在需要创建一个InnerClass的实例时,需要通过一个OuterClass的实例来创建,如上面的语句中在new运算符前添加了outer实例名,当然如果在OuterClass内的方法中创建InnerClass的实例时,是不需要这个前缀的。 有了一个内部类实例,通过使用变量名可以引用可用的方法和属性,8.3.2具有static修饰的内部类,public class OuterClass2 private String name; private String state; public OuterClass2(String name, String state) super(); = name; this.state = state; private void say() System.out.println(“外部:“ + name + “的状态是“ + state); static class InnerClass public void alarm() System.out.println(“static内部类无法使用OuterClass“ + “的非static修饰的属性和方法“); ,OuterClass.InnerClass inner=new OuterClass.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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代购服装合同样本
- dq兼职合同标准文本
- bot项目建设合同标准文本
- 股权众筹协议合同范例二零二五年
- 二零二五版无偿车辆使用合同
- 房产赠与合同范例
- 二零二五版股份转让及代持股权协议书
- 纳税担保合同
- 担保合同的担保方式与范围
- 2024年1月份零碳建筑能效指标履约责任书
- 国内外化工发展情况及安全形势
- 读书分享读书交流会《四世同堂》
- 2024年人教精通版四年级下册英语期末专项复习-阅读理解
- 中医推拿基础培训课件
- 防电信诈骗安全教案
- 产品履历表完
- 保健食品备案产品可用辅料及其使用规定
- 肺癌伴胸腔积液护理查房
- 健康管理中的健康教育与健康促进研究
- 2024年中考化学复习把握中考方向共研备考策略
- 新闻宣传“三审三校”审查表
评论
0/150
提交评论