版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java泛型机制一、应用场景二、Java泛型的概念三、泛型类的定义和使用四、泛型方法的定义和使用五、泛型接口的定义和使用本学习情境主要内容3一、应用场景泛型是java1.5提供的新特性,主要是为了解决数据类型的安全性问题。在Java开发中,对象的引用传递是最常见的,
需对常用操作进行封装,但是需要对传进来的数据对象进行处理,此时就使用到泛型。泛型的应用场景:不想写多个重载函数的场景。约束对象类型的场景,可以定义边界(Textends...),如JDK集合List,Set。用户希望返回自定义类型的返回值场景,如Json返回Javabean。在用反射的应用中,也经常会用到泛型,如Class<T>。对网页,对资源的分析,返回场景,一般都有泛型。其实泛型的应用还是很广的,一句话就是希望将数据类型参数化的地方,就可以用它。二、Java泛型的概念泛型是JDK1.5的一项新特性,它的本质是参数化类型(ParameterizedType)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候再指定具体的类型。publicclassGenericsClassName<T,SextendsT>{....}其中,GenericsClassName是泛型类,<T,SextendsT>是参数化类型。其本质是将数据类型作为参数进行传递。例如:可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java泛型的作用1.泛化可以用T代表任意类型。Java语言支持泛型,许多重要的类,比如集合框架,都已经泛型化了。2.类型安全泛型的一个主要目标就是提高Java程序的类型安全,使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果不用泛型,则必须使用强制类型转换。3.消除强制类型转换泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。4.向后兼容支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(GenericsJava程序)三、泛型类的定义和使用1.泛型类的定义在定义带类型参数的类时,在紧跟类命之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取值范围进行限定,多个类型参数之间用,号分隔。定义语法格式:访问修饰符class类名<泛型参数列表>{…}publicclassBox<T>{publicbooleanadd(Tt){}publicStringget(intindex){}public<T>Tshow(){}}其中,Box为泛型类,<T>为参数化类型。表示Box可以存放任意类型的数据。实例代码2.泛型类的使用在使用泛型类创建对象的时候确定泛型,即传递泛型类型参数。四、泛型方法的定义和使用1.泛型方法的定义在定义带类型参数的方法时,在紧跟访问修饰(例如public、private等)之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取值范围进行限定,多个类型参数之间用“,”号分隔。定义语法格式:定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T。定义完类型参数后,可以在定义位置之后的方法体的任意地方使用类型参数,就像使用普通的类型一样。在调用方法的时候确定泛型类型的参数值。例如:Box<String>box=newBox<>();box.add(“Jacket”);box.add(“shoes”);2.泛型方法的调用如果调用add(123)在编译时则出现错误说明几点(1)使用泛型方法时,返回值或参数是泛型定义的,应该保持一致。(2)如果定义类、接口时没有使用类型形参,但定义方法时可以定义类型形参。(3)泛型方法中的类型形参声明以尖括号括起来,放在方法修饰符和方法返回值类型之间。(4)泛型方法中的泛型参数无需显式传入实际类型参数。五、泛型接口的定义和使用1.泛型接口的定义泛型接口的定义格式:访问修饰符interface接口名<泛型参数列表>{//泛型方法}这是一个实例代码publicinterfaceGenericInterface<T>{public<T>Tprint(Tt);}GenericInterface为泛型接口,<T>为参数化类型。其中的泛型方法的定义参考《泛型方法的定义和使用》2.泛型接口的使用有两种使用方式第一种,定义泛型接口的实现类,并实现这个接口的方法第二种使用方式。实现类也是泛型类。有些时候在定义一个类去实现泛型接口时,并不确定这个类将要实现哪种类型的类,接口中的泛型尚未确认,这时就要求这个实现类也必须定义为泛型类,而且泛型名称要一致。接口类:GenericInterface.class实现接口的类:GenericClass.class创建类对象在创建对象的时候,声明类型可以使用泛型接口的实现类,也可以使用泛型接口(此时是向上转型)。通过new创建对象一定是使用泛型接口的实现类。都需要传递类类型参数GenericClass<Person>gc=newGenericClass<Person>();或者GenericInterface<String>gc1=newGenericClass<String>();泛型使用时的注意事项①在定义一个泛型类时,在“<>”之间定义形式类型参数,例如:“classTestGen<K,V>”,其中“K”,“V”不代表值,而是表示类型。②实例化泛型对象时,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。③泛型中<KextendsObject>,extends并不代表继承,它是类型范围限制。④使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型。⑤泛型类不可以继承Exception类,即泛型类不可以作为异常被抛出。⑥不可以定义泛型数组。⑦泛型类不可以继承Exception类,即泛型类不可以作为异常被抛出。⑧不可以定义泛型数组。⑨在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰。⑩不要在泛型类中定义equals(Tx)这类方法,因为Object类中也有equals方法,当泛型类被擦除后,这两个方法会冲突。小结泛型的本质是参数化类型泛型可用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法在定义泛型类时,在紧跟类名之后的<>内,指定一个或多个类型参数的名字在定义泛型方法时,在紧跟访问修饰之后、返回值之前的<>内,指定一个或多个类型参数的名字在定义泛型接口时,在紧跟接口名之后的<>内,指定一个或多个类型参数的名字Java泛型的使用实例一、任务描述二、任务分析、设计三、任务实施四、运行结果本学习情境主要内容34一、任务描述使用Java泛型机制编写应用程序。任务需求:设计一个泛型类Pair<K,V>,然后设计一个泛型接口,其中定义泛型方法compare(Pair<K,V>p1,Pair<K,V>p2),用于比较两个Pair<K,V>的对象是否相同。二、任务分析、设计首先定义泛型类Pair<K,V>,有两个属性k和v。接着定义泛型接口BaseInterface,其中设计一个泛型方法compare(),用于比较两个Pair的对象是否相同。再定义PairUtil类,实现泛型接口BaseInterface。最后定义测试类PairTest。其类图如图4-1所示。三、任务实施第一步,定义泛型类Pair<K,V>有两个类型参数K,V其中声明泛型方法compare以实现对两个Pair对象的比较,返回值为布尔类型。在访问修饰符和返回值类型之间使用泛型<K,V>参数
第二步,定义泛型接口publicinterfaceBaseInterface<K,V>{ public<K,V>booleancompare(Pair<K,V>p1,Pair<K,V>p2);}第三步定义类PairUtil,实现泛型接口publicclassPairUtil<K,V>implementsBaseInterface<K,V>{ @Override public<K,V>
boolean
compare(Pair<K,V>p1,Pair<K,V>p2){ //TODOAuto-generatedmethodstub return(p1.getKey().equals(p2.getKey()))&&(p1.getValue().equals(p2.getValue())); }}第四步,编写测试类Pair<String,String>p1=newPair<String,String>("name","zhang");Pair<String,String>p2=newPair<String,String>("name","liu");BaseInterface
utilBase=newPairUtil();System.out.println("比较结果:p1=p2\t"+utilBpare(p1,p2));首先创建两个Pair<String,String>的对象p1和p2,然后使用new通过泛型接口的实现类创建utilBase对象,再通过该对象调用比较方法compare()进行比较p1和p2。Pair<String,Integer>p3=newPair<String,Integer>("age",67);Pair<String,Integer>p4=newPair<String,Integer>("age",67);System.out.println("比较结果:p3=p4\t"+utilBpare(p3,p4));再创建两个Pair<String,String>的对象p3和p4,
通过泛型接口的实现类的对象utilBase对象,调用比较方法compare()进行比较p3和p4。Pair<Integer,String>p5=newPair<Integer,String>(1,"apple");Pair<Integer,String>p6=newPair<Integer,String>(2,"pear");booleansame=utilBpare(p5,p6);System.out.print("比较结果:p5=p6\t"+same);最后创建两个Pair<String,String>的对象p5和p6,
通过泛型接口的实现类的对象utilBase对象,调用比较方法compare()进行比较p5和p6。这是运行结果从结果中可以看出,p3和p4相同,因为其K和V都相同四、运行结果小结本学习情境通过一个实例讲述了Java泛型类、泛型接口、泛型方法的使用通用型DAO层使用泛型一、应用场景二、Java分层架构模式三、数据访问层DAO模式四、DAO接口、实现类五、不使用泛型时DAO接口、实现类六、使用泛型时通用DAO接口、实现类本学习情境主要内容50一、应用场景使用Java开发企业应用都会涉及到对象的持久化操作,为了降低业务逻辑操作的耦合度,通常需要创建大量的DAO(DataAccessObject)对象来访问数据库对象。DAO对象主要功能就是实现C(创建)R(读取)U(更新)D(删除)操作。数据库中的对象有很多,每一个对象都写一个DAO,显得很繁琐,每一个DAO都要写CRUD操作,这样代码的重复率高,在开发过程中我们常常需要花费大量的时间重复定义上述的方法。利用JDK5引入的泛型语法,实现一个通用的DAO对象,代码的复用得到了很好的应用,提高了代码的效率。二、Java分层架构模式这是Java的分层架构图表现层(JSP):表现层也称为界面层,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。业务层(逻辑层、service层):业务层(BusinessLogicLayer)是系统架构中核心部分。主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计。持久层(DAO):持久层,也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。采用DAO模式,建立实体类和数据库表映射(ORM映射)。三、数据访问层DAO模式DAO(DataAccessObject):数据存取对象,能够实现对持久化数据的访问。DAO在实体类与数据库之间起着转换器的作用,能够把实体类转换为数据库中的记录。DAO主要操作:读取、查找、保存、修改、删除。简称CRUD操作。DAO模式的组成部分DAO设计模式包括五部分:1.数据库连接类(包含数据库的连接与关闭操作的一个类)2.VO类(私有变量与数据库表格对应,接收数据库中表格各字段内容),3.DAO接口类(包含数据库的各项操作,增,删,改,查函数的定义),4.DAO实现类(具体实现DAO接口中定义的数据库操作函数),5.DAO工厂类(提供一个返回值为DAO接口类型的静态方法,获得DAO实现的实例)四、DAO接口、实现类在DAO模式中,需要编写DAO接口及DAO的实现类DAOImpl来操作数据库。DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录等等。DAO的实现类重写接口的方法。接口是一种抽象,只含有抽象方法和常量;接口是一种规范,它被用来要求类(Class)必须实现指定的方法;接口是一种契约,它可以有多种实现。为什么要使用接口?这是一个实例UserDAO接口声明了CRUD的方法UserDAOImpl类实现UserDAO接口publicinterfaceUserDAO{publicvoidinsert(Useruser)throwsException;publicvoidupdate(Useruser)throwsException;publicvoiddelete(intuserid)throwsException;publicUserqueryById(intuserid)throwsException;publicList<User>queryAll()throwsException;}publicclassUserDAOImplimplementsUserDAO{
@Overridepublicvoidinsert(Useruser)throwsException{//TODOAuto-generatedmethodstub}@Overridepublicvoidupdate(Useruser)throwsException{//TODOAuto-generatedmethodstub}@Overridepublicvoiddelete(intuserid)throwsException{//TODOAuto-generatedmethodstub}@OverridepublicUserqueryById(intuserid)throwsException{//TODOAuto-generatedmethodstub}@OverridepublicList<User>queryAll()throwsException{//TODOAuto-generatedmethodstub}DAO的实现类UserDAOImpl实现了DAO接口,重写了接口中定义的所有方法。也可以有自己的独有的方法五、不使用泛型时DAO接口、实现类在实际的工程项目中,有多个数据库中的表,例如高校图书管理系统中有,图书基本信息表Book,教师信息表Teacher,学生信息表Student,用户表User,出版社信息表Publishing,图书分类信息表Category等。可通过DAO实现对数据库中的表数据进行操作,包括增删改查(CRUD)操作。这些基本信息表对应Java的实体类,就是数据库中的表和Java对象里的一种映射关系(ORM)。如果每个实体类的DAO都包含CRUD操作。这样就使得代码冗余度较高。使用泛型接可以解决代码复用问题。对于BookDAO和StudentDAO、TeacherDAO,可以将公共的CRUD方法提取到BaseDAO中,这样提高了代码的复用,简化了代码。六、使用泛型时通用DAO接口、实现类BaseDAO使用了泛型接口和泛型方法,BaseDAOImpl使用了泛型类和泛型方法,里面封装了实体类相同的操作。当需要操作不同表的时候,将T换成相对应的实体类,即User或者是Teacher或者是其他的实体类就可以了。BookDAO、StudentDAO、TeacherDAO都是继承自BaseDAO,其处理接口和其实现类中只定义自己的特有方法。抽取原理图如下:BaseDAO中定义CRUD操作,包括add()、delete()、update()、queryAll()等方法BookDAO、StudentDAO、TeacherDAO继承BaseDAOBaseDAOImpl实现BaseDAOBookDAOImpl继承BaseDAOImpl、实现BookDAOStudentDAOImpl继承BaseDAOImpl、实现StudentDAOTeacherDAOImpl继承BaseDAOImpl、实现TeacherDAO1.定义BaseDAO接口publicinterfaceBaseDAO<T>{publicvoidinsert(Tt);publicvoidupdate(Tt);publicvoiddelete(intid);publicTqueryById(intuserid);publicList<T>queryAll();}使用了泛型接口,抽取的常规的CRUD操作实现步骤:publicinterfaceBookDAOextendsBaseDAO<Book>{
}publicinterfaceTeacherDAOextendsBaseDAO<Teacher>{}他们继承BaseDAO传递类型参数Book或Teacher2.定义实体DAO接口3.定义DAO的实现类publicclassBaseDAOImpl<T>implementsBaseDAO<T>{}其实现BaseDAO接口,重写BaseDAO接口中的方法,使用了泛型。publicclassBookDAOImplextends
BaseDAOImpl<Book>implementsBookDAO{}继承泛型类BaseDAOImpl<Book>,实现BookDAO接口。这里传递类型参数Book4.定义实体DAO的实现类publicclassTeacherDAOImplextends
BaseDAOImpl<Teacher>implementsTeacherDAO{}同样的,定义TeacherDAOImpl类继承泛型类BaseDAOImpl<Teacher>,实现TeacherDAO接口。这里传递类型参数Teacher同样的,定义StudentDAOImpl类publicclassStudentDAOImplextendsBaseDAOImpl<Student>implementsStudentDAO{
}继承泛型类BaseDAOImpl<Student>,实现StudentDAO接口这里传递类型参数Student小结DAO层是数据访问层,其功能主要是负责数据库的访问,实现CRUD操作DAO层是需要写DAO接口及其DAOImpl实现类使用泛型实现一个通用的DAO层,代码的复用得到了很好的应用,提高了代码的效率通用型DAO层使用泛型的应用实例一、任务描述二、任务分析、设计三、任务实施四、运行结果本学习情境主要内容81一、任务描述编写通用型DAO层应用程序任务需求:使用泛型机制编写通用型DAO层以实现对数据库表的CURD的操作。二、任务分析、设计Bean(实体类),
Book,Teacher,Student等DAO(数据访问层),
BaseDAO,BookDAO,TeacherDAO等Impl(具体方法实现),
BaseDAOImpl,BookDAOImpl,TeacherDAOImpl等JDBC(数据库连接类)Test(测试类)本实例中涉及的类和接口其类图如图所示DAO模式开发步骤(1)建立数据库,建表(2)创建实体类,和相应的数据库的表是对应的(3)创建Dao的基类接口(4)创建Dao的通用实现类(5)创建具体表的Dao类(6)创建具体表的Dao实现类(7)创建测试类三、任务实施1.
建立数据库,建表2.创建实体类(对应数据库的表)publicclassBook{ intid; Stringname; Stringpublisher; Stringauthor;//省略setter和getter方法}3.定义DAO的基接口BaseDAO使用泛型接口,声明CRUD方法,使用泛型方法4.定义DA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三、修改、保存和打开过程教学设计小学信息技术(信息科技)第三册下2014粤教版
- 人教版生物八年级下册第八单元第一章第二节免疫和计划免疫 教学设计
- 宠物医院管理公司医疗设备定期检修校准制度
- 宠物寄养服务公司员工入职培训管理制度
- 生态规律及其应用教学设计中职专业课-环境学基础-分析检验技术-生物与化工大类
- 人音版 (2019)必修《音乐鉴赏》不忘初心教案
- 第二章 机械传动教学设计高中物理粤教版选修2-2-粤教版2005
- 2025年人工智能测试题及答案
- 2026公共营养师之三级营养师真题试卷+答案
- 教育系统校园教学设施安全隐患排查整治方案
- 2025年江西省从“五方面人员”中选拔乡镇领导班子成员考试历年参考题库含答案详解(5套)
- 2025年中国银行秋招试题及答案
- 2025年11月济南轨道交通集团运营有限公司社会招聘笔试参考题库附带答案详解(10套)
- 2025年北京市中考数学真题试卷及答案
- 120急救站工作汇报
- 义警规章管理制度
- 2025年广东省深圳市福田区中考三模英语试题(含答案)
- CJ/T 409-2012玻璃钢化粪池技术要求
- DB31/T 668.4-2012节能技术改造及合同能源管理项目节能量审核与计算方法第4部分:锅炉系统
- (二模)黄山市及宣城市2025届高三毕业班质量检测 英语试卷(含答案)
- 小托福阅读:题型解析与应对策略
评论
0/150
提交评论