java 核心课件2-第1章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java2核心技术Ⅱ主讲教师:殷黎E_mail:yl_zwn@yahoo.com.cn本书课程安排第1章泛型第2章枚举第3章集合框架第4章实用类第5章网络编程基础第6章JDBC第7章JavaBean第8章Swing第9章RMI第1章泛型了解泛型相关概念;会创建泛型类和泛型方法;了解通配符和受限泛型;能熟练使用泛型类。1.1泛型概述首先分析、使用1-3页的例子程序;这是一个实现可动态扩展的数组的程序,且能存放任意类型的数据;从使用中可以看到,存放的数据取出来用时,必须强制转化为它的实际类型;这样不能保证程序类型的安全,增加了程序出错的几率,而且带来了麻烦;因此java中引入了“泛型”的概念。publicclassObjectGroup{privateObject[]elements;privateintsize;publicObjectGroup(){init();}privatevoidinit(){elements=newObject[10];size=0;}publicvoidadd(Objectobj){if(size=elements.length){Object[]temp=newObject[elements.length*2];System.arraycopy(elements,0,temp,0,elements.length);elements=temp;}elements[size]=obj;size++;}publicvoidclear(){init();}publicObject[]getElements(){Object[]temp=newObject[size];System.arraycopy(elements,0,temp,0,size);returntemp;}publicObjectget(intindex){returnelements[index];}publicintgetSize(){returnsize;}}泛型(Generics)本质上就是提供类型的”类型参数”,它们也被称为参数化类型(parameterizedtype)或参量多态(parametricpolymorphism);也指具有在多种数据类型上皆可操作的含义;声明时用参数化类型代替,使用时指定具体类型;GJ(GenericJava)是对Java语言的一种扩展,用GJ编写的程序看起来和普通Java程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换;实际上,编译时这些GJ程序也是首先被转化成一般的不带泛型的Java程序后再进行处理的;泛型的特点:类型安全、向后兼容、层次清晰、性能收益1.2泛型类泛型类就是具有一个或多个类型参数的类;1-4页代码中尖括号中的内容就代表类型参数,多个类型参数用“,”隔开;类型参数就跟在方法中普通的参数一样。就像一个方法有“形参”来描述它操作的参数的种类,一个泛型也有“形式类型参数”;当一个方法被调用,“实参”替换“形参”,方法被执行;当一个泛型声明被调用,“实际类型参数”取代“形式类型参数”;类型参数通常用单个大写字母命名;一般:E表示集合的元素类型,T表示任意类型,K,V表示表的键和值;类型参数一定是类类型;publicclassGenericGroupE{privateE[]elements;privateintsize;publicGenericGroup(){init();}privatevoidinit(){elements=(E[])newObject[10];size=0;}publicvoidadd(Eobj){if(size=elements.length){E[]temp=(E[])newObject[elements.length*2];System.arraycopy(elements,0,temp,0,elements.length);elements=temp;}elements[size]=obj;size++;}publicvoidclear(){init();}publicObject[]getElements(){E[]temp=(E[])newObject[size];System.arraycopy(elements,0,temp,0,size);returntemp;}publicEget(intindex){returnelements[index];}publicintgetSize(){returnsize;}}1.2.1泛型类的使用声明:class类名类型参数{//类体}使用:类名实际类型变量名=new类名实际类型();1.2.2泛型类的局限类型参数不能实例化:newE();//error不能实例化类型参数的数组:E[]arrE=newE[10];//error类的静态变量不能声明为类型参数类型:publicstaticEname;//error泛型类不能继承自Throwable以及其子类:publicclassProblemTextendsExeption//error1.2.3泛型与子类继承例:GenericGroupIntegergi=newGenericGroupInteger();GenericGroupNumbergn=newGenericGroupNumber();gn=gi;//errorGenericGroupInteger和GenericGroupNumber的数据类型都是GenericGroup,因此它们之间没有任何关系,Number和Integer的继承关系,对于它们不适用;这一点对于类型安全来讲是必要的;但可以向gn中添加Integer类型的数据:gn.add(18)1.3泛型接口与泛型类差不多,只是将关键字class改为interface即可。publicinterfaceCompT{intcompTo(Ta);}实际实现时,将类型参数传入实际类型即可:classPersonimplementsCompPerson{}1.5受限泛型当类型参数约束在某一范围内时,可以使用受限泛型;classGenericGroupEextendsNumber;受限泛型用关键字extends,即便限定类型是接口也用extends;有多个限定类型时,其中最多只能有一个类类型,且放在第一个,多个之间用‘&’隔开;classGenericGroupEextendsNumber&Comparable&Serializable;上例中传入的实际类型参数必须是Number的子类,且实现了接口Comparable和Serializable。实例化时,实际类型参数应在范围中定义一个showName方法,使其接受GenericGroupPerson类型的实参;publicstaticvoidshowName(GenericGroupPersongroup){for(inti=0;igroup.getSize();i++){System.out.println(Group.get(i).getName());}}注意:这个方法在向其传实参时只能传GenericGroupPerson,不能传GenericGroupStudent;修改上面的方法,将上限通配符运用到形参中,使其可以传入GenericGroupStudent。1.6上限通配符publicstaticvoidshowName(GenericGroup?extendsPersongroup){for(inti=0;iGroup.getSize();i++){System.out.println(group.get(i).getName());}}修改1.2.3节中的程序:GenericGroupIntegergi=newGenericGroupInteger();GenericGroup?extendsNumbergn=newGenericGroupNumber();gn=gi;注意:此时,gn.add(newInteger(2)),是错误的用法;因为“?extendsNumber”是上限通配符,表示一个未知的任何Number的子类;1.7泛型方法类型声明也可以用来声明泛型方法,而且这种泛型方法还可以用在非泛型类中。泛型方法允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。下面我们定义一个静态方法,返回GenericGrooup集合中的最大值:publicstaticEextendsCompEEmax(GenericGroupEgroup)从方法的声明可以看出:泛型方法的类型参数位于方法的返回类型前,并用括起来。可以看出,只要是实现了CompE的类型,都可以用于此方法。泛型方法可以位于非泛型类中publicstaticAextendsCompAAmax(GenericGroupAgroup){Amax=group.get(0);for(inti=1;igroup.getSize();i++){if(group.get(i).compTo(max)0){max=group.get(i);}}returnmax;}

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功