《java核心课件2第1章.ppt》由会员分享,可在线阅读,更多相关《java核心课件2第1章.ppt(20页珍藏版)》请在三一办公上搜索。
1、Java2 核心技术,主讲教师:殷黎E_mail:yl_,本书课程安排,第1章 泛型第2章 枚举第3章 集合框架第4章 实用类第5章 网络编程基础第6章 JDBC第7章 JavaBean第8章 Swing第9章 RMI,第1章 泛型,了解泛型相关概念;会创建泛型类和泛型方法;了解通配符和受限泛型;能熟练使用泛型类。,1.1 泛型概述,首先分析、使用1-3页的例子程序;这是一个实现可动态扩展的数组的程序,且能存放任意类型的数据;从使用中可以看到,存放的数据取出来用时,必须强制转化为它的实际类型;这样不能保证程序类型的安全,增加了程序出错的几率,而且带来了麻烦;因此java中引入了“泛型”的概念。
2、,public class ObjectGroup private Object elements;private int size;public ObjectGroup()init();private void init()elements=new Object10;size=0;public void add(Object obj)if(size=elements.length)Object temp=new Objectelements.length*2;System.arraycopy(elements,0,temp,0,elements.length);elements=temp;e
3、lementssize=obj;size+;,public void clear()init();public Object getElements()Object temp=new Objectsize;System.arraycopy(elements,0,temp,0,size);return temp;public Object get(int index)return elementsindex;public int getSize()return size;,泛型(Generics)本质上就是提供类型的”类型参数”,它们也被称为参数化类型(parameterized type)或参
4、量多态(parametric polymorphism);也指具有在多种数据类型上皆可操作的含义;声明时用参数化类型代替,使用时指定具体类型;GJ(Generic Java)是对Java语言的一种扩展,用GJ编写的程序看起来和普通Java程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换;实际上,编译时这些GJ程序也是首先被转化成一般的不带泛型的Java程序后再进行处理的;泛型的特点:类型安全、向后兼容、层次清晰、性能收益,1.2 泛型类,泛型类就是具有一个或多个类型参数的类;1-4页代码中尖括号中的内容就代表类型参数,多个类型参数用“,”隔开;类型参数就跟在方法中普通的参数一样。就
5、像一个方法有“形参”来描述它操作的参数的种类,一个泛型也有“形式类型参数”;当一个方法被调用,“实参”替换“形参”,方法被执行;当一个泛型声明被调用,“实际类型参数”取代“形式类型参数”;类型参数通常用单个大写字母命名;一般:E表示集合的元素类型,T表示任意类型,K,V表示表的键和值;类型参数一定是类类型;,public class GenericGroup private E elements;private int size;public GenericGroup()init();private void init()elements=(E)new Object10;size=0;publ
6、ic void add(E obj)if(size=elements.length)E temp=(E)new Objectelements.length*2;System.arraycopy(elements,0,temp,0,elements.length);elements=temp;elementssize=obj;size+;,public void clear()init();public Object getElements()E temp=(E)new Objectsize;System.arraycopy(elements,0,temp,0,size);return temp
7、;public E get(int index)return elementsindex;public int getSize()return size;,1.2.1 泛型类的使用,声明:class 类名/类体 使用:类名 变量名=new 类名();,1.2.2 泛型类的局限,类型参数不能实例化:new E();/error不能实例化类型参数的数组:E arrE=new E10;/error类的静态变量不能声明为类型参数类型:public static E name;/error泛型类不能继承自Throwable以及其子类:public class Problem extends Exepti
8、on/error,1.2.3 泛型与子类继承,例:GenericGroup gi=new GenericGroup();GenericGroup gn=new GenericGroup();gn=gi;/errorGenericGroup和GenericGroup 的数据类型都是GenericGroup,因此它们之间没有任何关系,Number和Integer的继承关系,对于它们不适用;这一点对于类型安全来讲是必要的;但可以向gn中添加Integer类型的数据:gn.add(18),1.3 泛型接口,与泛型类差不多,只是将关键字class改为interface即可。public interfac
9、e Comp int compTo(T a);实际实现时,将类型参数传入实际类型即可:class Person implements Comp,1.5 受限泛型,当类型参数约束在某一范围内时,可以使用受限泛型;class GenericGroup;受限泛型用关键字extends,即便限定类型是接口也用extends;有多个限定类型时,其中最多只能有一个类类型,且放在第一个,多个之间用&隔开;class GenericGroup;上例中传入的实际类型参数必须是Number的子类,且实现了接口Comparable和Serializable。实例化时,实际类型参数应在范围中,定义一个showName
10、方法,使其接受GenericGroup类型的实参;public static void showName(GenericGroup group)for(int i=0;i,不能传GenericGroup;修改上面的方法,将上限通配符运用到形参中,使其可以传入GenericGroup。,1.6 上限通配符,public static void showName(GenericGroup group)for(int i=0;iGroup.getSize();i+)System.out.println(group.get(i).getName();,修改1.2.3节中的程序:GenericGroup
11、 gi=new GenericGroup();GenericGroup gn=new GenericGroup();gn=gi;注意:此时,gn.add(new Integer(2),是错误的用法;因为“?extends Number”是上限通配符,表示一个未知的任何Number的子类;,1.7 泛型方法,类型声明也可以用来声明泛型方法,而且这种泛型方法还可以用在非泛型类中。泛型方法允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。下面我们定义一个静态方法,返回GenericGrooup集合中的最大值:public static E max(GenericGroup group)从方法的声明可以看出:泛型方法的类型参数位于方法的返回类型前,并用括起来。可以看出,只要是实现了Comp的类型,都可以用于此方法。泛型方法可以位于非泛型类中,public static A max(GenericGroup group)A max=group.get(0);for(int i=1;i0)max=group.get(i);return max;,