javach05泛型和枚举.ppt

上传人:sccc 文档编号:5598373 上传时间:2023-07-31 格式:PPT 页数:31 大小:210.51KB
返回 下载 相关 举报
javach05泛型和枚举.ppt_第1页
第1页 / 共31页
javach05泛型和枚举.ppt_第2页
第2页 / 共31页
javach05泛型和枚举.ppt_第3页
第3页 / 共31页
javach05泛型和枚举.ppt_第4页
第4页 / 共31页
javach05泛型和枚举.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《javach05泛型和枚举.ppt》由会员分享,可在线阅读,更多相关《javach05泛型和枚举.ppt(31页珍藏版)》请在三一办公上搜索。

1、Java程序设计Programming in Java,谷勇浩北京邮电大学 计算机学院,第 5 章 泛型和枚举,本章总体纲要,泛型枚举,泛型和枚举,泛型(Generics)与多态性相似:提高程序代码的复用性与多态性不同:减少数据的类型转换(p112)枚举通过定义枚举常量,在一定程度上增加程序代码的可读性,泛型定义格式,泛型:通过给类或接口增加类型参数实现,类型参数可以是任何对象或接口。类类修饰词列表 class 类名 extends 父类名 implements 接口名称列表 类体接口接口修饰词列表 interface 接口名 extends 接口名称列表 接口体,类型参数的定义格式,类型变量

2、标识符等价于“类型变量标识符 extends java.lang.Object”类型变量标识符 extends 父类型类型变量标识符 extends 父类型1&父类型2&.&父类型n要求:在各个类型中最多只能有1个是类,其余类型均为接口含义:所定义的类型变量具有格式中规定的各个父类型的所有能力,类型参数的使用,public class J_Add 具有泛型特性的类或接口,类型参数定义后,在类或接口体内可直接使用相应的类型变量(作为变量的类型或者方法的类型)在应用这些具有泛型特性的类或接口时,需要指明实际的具体类型,即J_Add对于第二种形式的定义,要求使用的实际类型必须是格式中父类型的子类型对

3、于第三种形式的定义,要求使用的实际类型必须具有格式中父类型的所有能力,示例1,/J_Add.java/泛型例程public class J_Add public String mb_sum(T a1,T a2,T a3)return(a1.toString()+a2.toString()+a3.toString();/方法mb_sum结束 public static void main(String args)J_Add b=new J_Add();Integer a1=new Integer(1);Integer a2=new Integer(2);Integer a3=new Intege

4、r(3);System.out.println(b.mb_sum(a1,a2,a3);/方法main结束/类J_Add结束,编译、运行&结果,示例1说明,类型T是类java.lang.Object的子类型,所以参数a1、a2、a3可以调用类java.lang.Object的成员方法toString(),该过程称为类型检查操作,在编译过程会进行差错操作,提高程序的安全性。J_Add b=new J_Add();定义类型为J_Add的变量b,同时创建一个类型为J_Add的实例对象。类J_Add的类型变量T所对应的实际类型还可以是其他类型,只要该类型是类java.lang.Object的子类型,如类

5、java.lang.Long,示例2,/J_AddInterface.java/泛型例程interface J_Interface public int mb_sum(T a1,T a2,T a3);/接口J_Interface结束public class J_AddInterface implements J_Interface public int mb_sum(T a1,T a2,T a3)int b1=a1.intValue();int b2=a2.intValue();int b3=a3.intValue();return(b1+b2+b3);/方法mb_sum结束,示例2,publ

6、ic static void main(String args)J_AddInterface b=new J_AddInterface();Integer a1=new Integer(1);Integer a2=new Integer(2);Integer a3=new Integer(3);System.out.println(b.mb_sum(a1,a2,a3);/方法main结束/类J_AddInterface结束,编译、运行&结果,示例3,J_Genericity.java输出结果AB例程说明class J_T,说明类型T是类J_C1的子类,同时也是实现接口J_C2的类。class

7、J_C3 extends J_C1 implements J_C2,说明类J_C3是J_C1的子类,同时用于实现接口J_C2的类。J_T a=new J_T()及a.mb_methodT(new J_C3),说明类J_C3是类型T的实际类型。,泛型的类型检查,在构造一个Generics对象时,编译器将首先检查参数化类型是否有效(例如是否满足限制条件等),确定所有参数化类型,然后编译器将在使用这些参数化类型的地方进行类型检查,如果符合定义,那么编译通过,否则将编译失败,报告类型检查错误。因此,通过这种方式,编译器可以检查出很多类型不匹配的错误,避免开发人员的错误,这也是Generics的重要优点

8、之一。,泛型的类型检查例子,Vector strvector=new Vector();指定向量strvector中元素的类型为StringVector intvector=new Vector();指定向量intvector中元素的类型为Integerstrvector.add(new String();/OKstrvector.add(new Object();/编译失败,需要String类strvector.add(new Integer();/编译失败,需要String类intvector.add(new Integer();/OKintvector.add(new String();

9、/编译失败,需要Integer类,泛型,为什么用泛型(避免类型转换)如果不使用泛型,就需要定义不同的多个类,或者通过继承来实现,而通过继承实现往往引起数据类型的转换问题。何时用泛型(部分操作抽象化)在设计集合类和它们的抽象操作时,往往需要将它们定义为与具体数据类型无关,在这种情况下,使用泛型就是非常适合的。,泛型,泛型避免类型转换J_Test1.java(不用泛型需要类型转换)String s=(String)h.get(new Integer(0);/如果去掉强制转换符(String)后,出现编译错误J_Test2.java(采用泛型避免类型转换)泛型只有在1.5及以上版本才支持。(Ecli

10、pse默认设置编译环境为1.5以下),泛型,使用泛型使部分操作抽象化Example5_1.java计算锥体体积时,不关心它的底是什么类型以及如何计算面积的。,本章总体纲要,泛型枚举,枚举的基本定义格式,创建枚举类型的目的:定义一些枚举常量枚举类型修饰词列表 enum 枚举类型标识符 枚举常量1,枚举常量2,.,枚举常量n枚举类型修饰词可以是public或者默认值,不能是protected、private和abstract若是public,则要求该枚举类型所在的文件名前缀与枚举类型标识符指定的名称相同,而且该文件中不能含有其他public类、接口或枚举若是默认属性,则该枚举类型只能在同一个包内使

11、用,示例,enum E_SEASON 春季,夏季,秋季,冬季/定义了四个枚举常量/枚举E_SEASON结束,枚举变量,枚举类型变量,简称枚举变量。定义格式有两种枚举类型标识符 枚举变量;枚举类型标识符 枚举变量1,枚举变量2,枚举变量n;枚举数组变量的定义E_SEASON s;,枚举变量,对于枚举类型,不能通过new运算符创建实例对象可以通过枚举类型标识符访问枚举常量E_SEASON s=E_SEASON.春季;/定义了E_SEASON枚举类型变量s成员方法public String name()public String toString()/功能:均为返回枚举常量所对应的字符串s.name

12、()与E_SEASON.春季.toString()都返回“春季”,成员方法values,该成员方法用来获得该枚举类型的所有枚举常量,格式为:枚举类型标识符.values()通过该方法返回由枚举类型所有枚举常量组成的枚举数组,例如:E_SEASON sa=E_SEASON.values();/sa含有四个元素,E_SEASON.春季,E_SEASON.夏季,E_SEASON.秋季,E_SEASON.冬季,示例,/J_Enum.java/枚举例程enum E_SEASON 春季,夏季,秋季,冬季/枚举E_SEASON结束public class J_Enum public static void

13、main(String args)E_SEASON sa=E_SEASON.values();E_SEASON sb=sa0;for(int i=0;i sa.length;i+),switch(sai)case 春季:System.out.println(春季花满天);break;case 夏季:System.out.println(夏季热无边);break;case 秋季:System.out.println(秋季果累累);break;case 冬季:System.out.println(冬季雪皑皑);break;/switch结构结束/for循环结束System.out.println(

14、sb=E_SEASON.春季 is+(sb=E_SEASON.春季);System.out.println(sb.夏季=E_SEASON.夏季 is+(sb.夏季=E_SEASON.夏季);System.out.println(sb=E_SEASON.夏季 is+(sb=E_SEASON.夏季);/方法main结束/类J_Enum结束,编译、运行&结果,示例说明,switch语句中条件表达式类型可以是枚举类型用法:switch语句各个分支直接采用枚举常量标识符,如case 春季;不能写成:case E_SEASON.春季或case sai.春季关于枚举常量都是public static fin

15、al类型(类似于静态成员域),可通过枚举类型标识符(E_SEASON)访问,也可通过枚举变量访问(sb)“.”运算不改变枚举变量(sb)的值.,本章小结,泛型可提高程序的复用性相对多态性,泛型采用代码替换方式,即用实际类型替换类型变量。J_ADD代替J_ADD替换过程可以减少在直接采用多态性时的数据类型转换,从而减少因为数据类型转换可能引发的数据精度丢失等问题。通过枚举类型定义枚举常量,作业,请应用泛型编写程序。首先定义一个接口,它至少包含一个可以计算面积的成员方法;然后编写实现该接口的两个类:正方形类和圆形类;接着编写一个具有泛型特点的类,利用这个类实现在控制台窗口中输出某种图形的面积,而且这个类的类型变量所对应的实际类型可以是前面编写的正方形类或圆形类。最后利用这个具有泛型特点的类在控制台窗口中分别输出给定边长的正方形的面积和给定半径的圆的面积。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号