Ch01-泛型和泛型接口.ppt_第1页
Ch01-泛型和泛型接口.ppt_第2页
Ch01-泛型和泛型接口.ppt_第3页
Ch01-泛型和泛型接口.ppt_第4页
Ch01-泛型和泛型接口.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

计算机学院 赵卓君 北京理工大学珠海学院 Java深入编程 计算机学院 软件工程教研室 赵卓君 QQ: 290913207 手机:Email: 办公室:HA202 计算机学院 赵卓君 课程简介 n本课程是Java程序设计的后续高级课程。 n在上学期所学Java基础知识上,进一步深入介 绍Java语言的高级特性,包括泛型和泛型接口 、序列化和反序列化、GUI图形用户界编程、 JDBC数据库连接、线程、Applet和网络编程等 。 n学完本课程后,学生可以开发出基于Swing组 件的C/S架构应用系统和Java网络通讯系统, 如:学生成绩管理、图书信息管理、网络聊天 室等系统。也可参加Java认证的SCJP考试。 计算机学院 赵卓君 课程知识点介绍 整个课程共七章: 第一章:泛型和泛型接口(重点) 第二章:序列化和反序列化 第三章:GUI图形用户界面编程(重点、难点 ) 第四章:JDBC数据库连接(重点、难点) 第五章:线程和多线程(重点、难点) 第六章:Applet和网络编程(难点) 第七章:C/S架构应用程序开发 (难点) 计算机学院 赵卓君 教学及考核安排 n本课程是考查课,共48学时(其中理论26学 时,实验22学时) n考核方式(闭卷、笔试): q出勤20% q作业10% q实验20% q期末50% 总计100% 计算机学院 赵卓君 学习要求 n上课认真听讲,做笔记。 n课后及时消化上课的知识点。 n保证出勤,不旷课、迟到、早退(包 括上机课)因为出勤占了20%。 n按时交课外作业和实验作业。之后补 交作业会酌情扣分,抄袭别人的作业 (或者复制粘贴别人的作业)不算提 交该次作业。 计算机学院 赵卓君 北京理工大学珠海学院 第一章 泛型和泛型接口 计算机学院 赵卓君 主要内容 n回顾上学期所学的集合概念:List、Set和 Map接口,Iterator接口,Comparable和 Comparator接口 n类型安全和泛型的概念和使用(重点) n泛型类、泛型方法、泛型接口: Comparable、Comparator (重点 ) n类型通配符?和有限制的通配符(难点) 计算机学院 赵卓君 集合框架包含的内容 1接口 Collection List Map 2具体类List ArrayList LinkedList Map HashMap 3算法 Java集合框架为我们提供了一套性能优良、使用方便的接口和类,我们 不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出 现的问题了 。Java集合框架位于java.util包中 Collections 提供了对集合进行排序、遍历等多种算法实 现,如 sort()、reverse()、shuffle() 采用键-值对的映射 存储方式,长度可 动态改变 采用线性列表的存储 方式,长度可动态改 变 Set 不保证元素的顺序,不允 许出现重复的元素 Vector Hashtable Set TreeSetHashSet 计算机学院 赵卓君 集合接口 nList接口 nMap接口 nSet接口 元素以线性方式存储 存储的顺序与添加的顺序相同 以键-值的映射来存储元素 键值不允许重复 不保证元素的顺序 不允许重复元素 计算机学院 赵卓君 List 接口 n允许重复的元素 n允许null值 n元素在集合中的顺序与添加顺序一致 n常用的实现该接口的类: qArrayList 动态数组 qVector 向量 qLinkedList 链表 qStack 堆栈(LIFO) ArrayList、Vector、LinkedList区别 nArrayList 和Vector是采用数组组方式存储储数据, 允许许直接序号索引元素,但是插入数据要设计设计 到 数组组元素移动动等内存操作,所以索引数据快插入 数据慢,Vector由于使用了synchronized(线线程 安全)方法,但是性能上比ArrayList要差 nLinkedList使用双向链链表实现实现 存储储,按序号索引 数据需要进进行向前或向后遍历历,但是插入数据时时 只需要记录记录 本项项的前后项项即可,所以插入数度 较较快! nStack是按照堆栈栈的原理来存储储数据,先进进后出 计算机学院 赵卓君 计算机学院 赵卓君 Set 接口 nSet接口不保证元素的顺序,不允许出现重复的元素 n实现Set接口的类:HashSet、TreeSet nHashSet类不允许出现重复元素,不保证集合中元素 的顺序,只允许一个null元素。 nTreeSet是Set的一种变体,可以实现按照自然顺序排 序。在添加元素时会自动将其插入到已经有序的元 素序列中。 q字符串按照“字典”的顺序 q整数按照数字大小的顺序 HashSet和TreeSet的区别:HashSet不保证元素的顺序,而 TreeSet可以自然顺序插入添加的元素 计算机学院 赵卓君 Map 接口 n使用键值的成对映射来存贮元素 n键值不允许重复 n常用实现Map接口的类: 类名null元素顺序线程安全 HashMap允许null键和值 不保证元素的顺序 线程不安全 Hashtable 不允许有null键 和值 不保证元素的顺序 线程安全 TreeMap不允许有null键 可以按键的自然顺 序将值排序 计算机学院 赵卓君 Iterator接口 nIterator接口可以以统一的方式对各种集合元素进 行遍历,也称为“迭代器”。它还可以在遍历元素 的同时移除元素。 nhasNext()方法检测集合中是否还有下一个元素。 nnext()方法返回集合中的下一个元素。 nIterator遍历集合元素的语法: Iterator it = 集合对象名.iterator(); while(it.hasNext() Object o=it.next(); System.out.println (o); 计算机学院 赵卓君 Comparable 接口-1 nJava.lang包中定义的一个比较对象的接口 n提供抽象方法compareTo(),可以对对象 进行整体排序。 n使用方法:对要进行比较对象的类实现 Comparable接口,重写compareTo()方法 nComparable接口不仅仅用于集合框架,可 用于任何需要进行对象比较的场合。 计算机学院 赵卓君 Comparable 接口-2 示例: class Student implements Comparable int id; String name; public int compareTo(Object obj) Student s=(Student)obj; return this.id-s.id; 重写Comparable 接口的compareTo 方法 实现Comparable 接口 计算机学院 赵卓君 Comparator 接口-1 nJava.util包中提供的一个对某个对象 集合进行整体排序的比较接口 n提供了compare的比较方法来比较对 象 n使用方法: q定义实现该接口的类,重写compare方法 q实例化该类的对象 q把该对象作为Collections.sort()方法的 参数。 计算机学院 赵卓君 Comparator 接口-2 /实现Comparator接口,比较学生的姓名 class NameComp implements Comparator /重写compare方法 public int compare(Object o1,Object o2) Student s1=(Student)o1; Student s2=(Student)o2; return pareTo(); public static void main (String args) NameComparator nc=new NameComparator(); Collections.sort(al,nc); 计算机学院 赵卓君 类型安全问题-1 任何对象加入集合类后,自动转变为Object类型;取出时,需 要进行强制类型转换,恢复为特定的类型 ObjectObjectObject 加入集合 从集合中取出 (Rabbit) object(Car) object (Student) object RabbitCarStudent RabbitCar Student 计算机学院 赵卓君 类型安全问题-2 假设在ArrayList集合对象students中添加Sudent类 对象,也添加一个Teacher类的对象,会怎样? class StudentString name;int age; class TeacherString name;int age; ArrayList students=new ArrayList(); Student xm=new Student(“小明“, 20); Student xh=new Student(“小红“, 19); Student xj=new Student(“小杰“, 18); students.add(xm); students.add(xh); students.add(xj); Teacher jacky = new Teacher(“成龙“, 40); students.add(jacky); for(Object stuo:students) Student stu = (Student)stuo; System.out.println(stu.Name) ; 遍历这个集合 是否有问题? 能否加入一个 Teacher类的对象? 计算机学院 赵卓君 类型安全问题-3 students集合 小明 小红 小杰 成龙 添加对象 遍历集合 对象存储不 易控制 类型转换 容易出错 Teacher对象 运行错误 计算机学院 赵卓君 什么是泛型(Generics)? nJDK1.5引入的新特性。 n在创建集合对象时就规定其允许保存的元素类型, 然后由编译器负责检查所要添加元素的合法性。在 取用元素时就不必再进行强制性的类型转换处理。 其实就是将原本确定不变的类型参数化。 /例如:定义只能存储字符串的ArrayList集合对象 ArrayList list=new ArrayList( ); list.add(“Welcome“); /编译通过 list.add(“Hello“); /编译通过 list.add(new Student(); /编译错误 for(String s:list) System.out.println();/取出元素时无需进行类型转换 计算机学院 赵卓君 使用泛型的优点 n保证集合中所有元素的数据类型相同 n从泛型集合中取出元素时无需再做类型转换 n向集合中添加不符合指定类型的数据,编译 时会发生错误信息,避免运行时错误的发生 n是原有Java类型体系的扩充,是编译时的保 护。 n可以提高Java应用程序的安全性、可维护性 和可靠性。 计算机学院 赵卓君 泛型的向后兼容性 nJava中的泛型是可以向 后兼容的。即,可以不采 用泛型,继续沿用过去的 做法。如左图: ArrayList list=new ArrayList(); list.add(“Welcome“); /编译通过 list.add(new Student(); /编译通过 n但编译后会出现以下警告: n要想避免该警告,可以在类的前面使用 SuppressWarnings (“unchecked“)的注解 SuppressWarnings (“unchecked“) class Demo public static void main(String args) ArrayList list=new ArrayList(); list.add(“Welcome“); 计算机学院 赵卓君 泛型高级特性1泛型类 n类的定义可在类名后面用尖括号括起一个类型 参数。这种由类型参数修饰的类被称为泛型类 。泛型类也属于引用类型。 public class Demo private T m; public T getM( ) . 类型参数 Demo d=new Demo( ); 则 T 代表String类型 n参数T是一个类型形参,在使用该泛型类时才 指定具体类型参数。 计算机学院 赵卓君 泛型高级特性2泛型方法 n方法也可以泛型化,如: n实际调用该方法时才确定参数,如: qevaluate(“hello“, “hello“); qevaluate(new Integer(100),new Integer(300); q类型参数T也可以添加到其所在的类中,该类就变 成泛型类。 public T evaluate(T a,T b) 表示该方法为泛型方法 计算机学院 赵卓君 受限的类型参数 n实例化泛型类时,可以将类型参数T的位置 用任意的引用类型代替。 n如果要求该类型参数是某一父类的子类时 ,受限的类型参数可以兼顾通用性和针对 性: public class Point 表示该泛型类只可以传递 Number类型或其子类 计算机学院 赵卓君 使用泛型方法和泛型类 n什么时候使用泛型方法,而不是泛型 类呢? q添加类型约束只作用于一个方法的多个参 数之间、而不涉及到类中的其他方法时, 使用泛型方法 q施加类型约束的方法为静态方法,只能将 其定义为泛型方法,因为静态方法不能使 用其所在类的类型参数。 计算机学院 赵卓君 泛型接口 nIterator可以在使用迭代器遍历历集 合元素时时无需类类型转换转换 nComparable和Comparator 其使用和以前一样样,只是多了泛型的 安全机制 计算机学院 赵卓君 类型通配符-1 n同一个泛型类与不同的类型参数复合而成的类 型之间并不存在继承的关系,见以下代码: class Person class Student extends Person public class GenericDemo3 public static void main (String args) Vector v=new Vector( ); 编译报错:不兼 容的类型 同一个泛型类与不同类型参数复合而成的类型之间并不存在 继承关系 计算机学院 赵卓君 类型通配符-2 n如果刚才的继承关系是合理的,则会出现以下尴尬 矛盾的代码: class Person class Student extends Person class Teacher extends Person public class GenericDemo3 public static void main (String args) Vector v=new Vector(); Vector vp=v; Teacher t=(Teacher)vp; /违反泛型的定义! 计算机学院 赵卓君 类型通配符-3 nVector是任何泛型类Vector的父类 nVector类型的变量在调用方法时有限制 凡是必须知道具体类型参数才能进行的 操作均被禁止。如,Vector上禁止调用 add()方法。但并不等于是“只读”,例如可 以执行remove()方法。 nVector表示集合里面的元 素是A类或其子类的对象

温馨提示

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

评论

0/150

提交评论