Java程序设计教程课件_第1页
Java程序设计教程课件_第2页
Java程序设计教程课件_第3页
Java程序设计教程课件_第4页
Java程序设计教程课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

人民邮电出版社7接口、Lambda表达式和枚举第章导读Introduction接口,是java提供的一个重要的类型,是对抽象类的进一步抽象。通过接口的继承和接口回调技术,可以实现“多重继承”,并实现“行为”上的多态。

Lambda表达式是一种提高编程效率的表达形式,配合函数式接口或匿名类可以使得程序代码更加简洁明了。枚举可以将对象的所有值一一列举出来,提高程序的可读性和健壮性。C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结1、接口的概念Java接口是由若干常量和方法声明组成的集合。接口中的方法只有声明没有实现。这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。定义接口的目的在于规范对象的行为,告诉接口的实现者必须做什么,但不要求怎么做,由实现者根据自身情况决定怎么做。接口中定义的常量是接口的特征属性,用于规范接口要求。7.1.1接口的概念与定义2、接口的定义格式如下:[修饰符]interface接口名称[extends父接口名列表]{[public][static][final]数据类型变量名=常量值;[public][abstract]返回值类型方法名(参数列表);}7.1.1接口的概念与定义publicinterfaceCubage{ publicstaticfinaldoublePI=3.1415926;publicabstractdoubledoCubage();}2、接口的定义7.1.1接口的概念与定义例如,定义一个接口Cubage,实现计算物体的体积。1、语法上的不同7.1.2接口与abstract类(1)抽象类中既可以包含抽象方法,也可以包含非抽象的普通方法;而接口中所有的方法必须是抽象方法;(2)抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的;(3)抽象类中可以有普通成员变量,而接口中的所有变量均为publicstaticfinal修饰,即均为常量;(4)抽象类里可以有构造方法,而接口内不能有构造方法;(5)一个类可以实现多个接口,但只能继承一个抽象类。C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结7.2.1用类实现接口[修饰符]class类名[extends父类名][implements接口A,接口B,···]{类成员变量和成员方法;为接口A中的所有方法编写方法体,实现接口A;为接口B中的所有方法编写方法体,实现接口B;}格式:如果一个非抽象类实现了某个接口,那么这个类就要重写接口中的所有方法。接口中的方法均用publicabstract修饰,所以在类重写这些方法时也一定要用public进行修饰。【例7.1】定义接口并实现接口计算圆柱和圆锥的体积。

Example7_1.java7.2.2定义接口中的方法C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结7.3.1接口中多态的概念接口多态是指不同的类在实现同一个接口时具有不同的实现过程,当接口变量进行回调接口方法时就具有多种不同的形态。实现接口的多态性通常会使用到Java的接口回调技术。接口回调本质上与继承中的上转型相同,不同之处是,接口回调是用接口句柄来获得并调用实现这个接口的子类的引用,而上转型是用父类句柄来获得并调用实现此父类的子类的引用。7.3.2通过接口实现多态在接口定义时,将不同类的相同行为抽象出来成为接口,每个类对接口中的方法给出具体的行为实现。当通过接口句柄调用方法时,系统会根据具体的子类对象决定执行哪个类中相应的方法,从而实现行为多态。【问题分析】根据问题描述,可以确定有员工、台灯和计算机三个类。它们之间的相互关系是员工使用台灯和计算机,产生的行为是开、关台灯和计算机,并且这个行为对台灯和计算机产生的结果不相同,灯是打开、熄灭,计算机是启动系统、关闭系统。台灯和计算机都要有开、关行为,然而,这两类完全不同,因此将开、关行为抽象成接口来实现。7.3.2通过接口实现多态【例7.2】一个公司的员工,每天上班后打开桌上的工作灯,打开电脑开始工作。下班前,关闭计算机和台灯,然后下班。请进行编程描述这一过程。Example7_02.javaC目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结接口主要是对不同类型的对象所具有的相同行为进行统一和规范,重点在于“行为”,而与类型无关,所以更适于功能扩展。7.4接口的设计与使用【问题分析】根据题意,首先定义一个USB接口,然后定义若干个USB设备实现USB接口的读写功能。最后,通过一个带有USB接口的计算机对象完成USB设备的接入、读写、移除等操作。【例7.3】编写程序,模拟计算机使用USB设备的过程。

Example7_03.java7.4接口的设计与使用C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结从Java8开始,接口里允许定义默认方法,解决接口功能增加的问题。即接口的继承类不需要重写接口中新增的方法,就可以直接使用新功能。格式如下:[public]default返回值类型方法名称(参数列表){…….//方法体}7.5.1默认方法默认方法的定义使用default进行修饰,并且有了方法体。接口在进行功能扩展时,可以根据需要增加若干个默认方法。继承接口的子类既可以直接继承并使用该默认方法,也可以重写覆盖该默认方法,从而使得接口的定义和使用更为灵活、方便。7.5.1默认方法【问题分析】根据题意,在原有的USB接口上增加充电的功能。以往处理方法:在USB接口定义中增加一个抽象方法publicabstractvoiddoCharge(),然后对所有继承该接口的子类进行方法重写,以保证程序的正确运行。缺点:导致大量的代码修改,不仅费事费力,还容易导致代码错误。现在可以利用默认方法来实现这一功能。优点:继承该接口的子类无需任何更改即可以根据需要直接使用这个功能。Example7_04.java【例7.4】基于例7.3,增加USB接口功能:USB接口充电

7.5.1默认方法从Java8开始,接口里也允许定义静态方法,可以直接通过接口名进行调用。格式如下:[public]static返回值类型方法名称(参数列表){…….//方法体}7.5.2静态方法静态方法的定义使用static进行修饰,并且也有方法体,在定义该方法的同时就可以直接给出方法的实现内容。7.5.2静态方法静态方法特点:接口的静态方法定义和使用与类的静态方法基本一样,在调用时只能通过接口名进行调用,而不能使用子类名或子类对象进行调用。【例7.5】静态方法应用举例。Example7_05.java

7.5.2静态方法从Java9开始,接口里增加私有方法,实现默认方法或静态方法中的代码共享。格式如下:格式1:private返回值类型方法名称(参数列表){…//方法体}7.5.3私有方法格式2:privatestatic返回值类型方法名称(参数列表){…//方法体}私有方法的定义包括普通私有方法和静态私有方法两种格式。分别用于默认方法和静态方法中。静态方法中只能调用静态私有方法。默认方法中两者都可调用。7.5.3私有方法【例7.6】私有方法应用举例。Example7_06.java

7.5.3私有方法7.5.4接口多重继承冲突的处理1.相同的抽象方法:子类继承时必须重写并且只需重写一个抽象方法即可。2.相同的默认方法:子类继承时必须重写,如果想引用父接口的默认方法,则可以通过:接口名.super.方法名()的形式进行调用。3.相同的静态方法:静态方法只跟接口有关,所以静态方法重名在使用中没有任何影响。在多重继承时出现不同接口中的相同方法,按照给定规则进行继承和重写C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结1、什么是Lambda表达式Lambda表达式,是一个匿名方法的实现形式。本质是一种把方法作为参数进行传递的编程思想。利用Lambda表达式,可以精简程序的代码量,使程序更加简洁明了,也减少了程序员的工作量。

Java语言在版本8中引入了这种表达式。7.6.1Lambda表达式的概念和语法2、语法格式格式如下:

([参数])->{语句;}说明:Lambda表达式主要分为3个部分:“()”是声明的参数,各参数用逗号进行间隔;箭头符号“->”是正则表达式的操作符,表示将参数内容传到后面的语句中;“{}”中就是实现功能的代码块,是整个表达式的主体。7.6.1Lambda表达式的概念和语法用Lambda表达式实现的形式为:(intx,inty)->{intz=x+y;returnz;}2、语法格式7.6.1Lambda表达式的概念和语法例如,定义一个方法intadd(intx,inty);来计算两个整数的和3、Lambda表达式的简略规则可选类型声明:定义参数时不需要声明参数类型,编译时系统会自动根据上下文推断数据类型。可选的参数圆括号:只有一个参数时可以省略圆括号,但有多个参数时需要定义圆括号。可选的大括号:如果主体中只有一个语句,可以省略大括号。可选的return关键字:如果主体中只有一个表达式可以省略return语句,在大括号中需要有一个return语句。7.6.1Lambda表达式的概念和语法上例可简写为:(x,y)->x+y【问题分析】:根据题意,显然不是重新进行类定义,而是想在以后的应用中根据需要使用到这个接口功能。方法1:采用前面所学习的匿名类的方式加以处理,在生成实例时重写其中的方法来实现。方法2:接口中只有一个抽象方法,则可以用Lambda表达式来实现,使得代码更加简洁。Example7_07.java【例7.7】参考例7.1,如果一个类(Cone)在定义时没有继承这个接口,在后续的应用中如何实现这个接口功能(方法)呢?

7.6.1Lambda表达式的概念和语法例7.7说明:在本程序代码中,给出了三种不同的接口实现方式。方式1是传统的实现方法,即在方法定义时直接继承接口并重写方法。方式2采用了匿名类的形式实现,在用new生成实例的同时给出方法体。方式3则采用了Lambda表达式的形式实现接口。7.6.1Lambda表达式的概念和语法该Lambda表达式语句的完整写法:Cubage<Cone>cubage1=(Conecone)->{doubleresult;result=Cubage.PI*cone.getH()*cone.getR()*cone.getR()/3;returnresult;};4、Lambda表达式的方法引用方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。如果抽象方法的实现恰好可以通过调用另外一个方法来实现,就可以使用方法引用。7.6.1Lambda表达式的概念和语法类型Lambda表达式引用语法构造方法引用(p)->new类名(p)类名::new实例方法引用(p)->instance.instanceMethod(p)instance::instanceMethod对象方法引用(instance,p)->类名.instanceMethod(p)类名::instMethod静态方法引用(p)->类名.staticMethod(p)类名::staticMethod常用的方法引用类型及语法1、函数式接口的定义所谓函数式接口,是指在接口定义中,只有一个待重写的抽象方法。在例7.1中定义的Cubage接口就属于函数式接口,其内部只有一个抽象方法doCubage()。函数式接口中的抽象方法是指自身只能定义一个抽象方法,不包括从父类继承下来的方法。7.6.2函数式接口2、@FunctionalInterface注解在接口定义前加上一个@FunctionalInterface注解,表明该接口是一个函数式接口。系统会自动检查该接口定义是否符合函数式接口规范。函数式接口只是限制了抽象方法只能有一个,对于其他的方法定义,如默认方法、静态方法等没有约束。7.6.2函数式接口3、常用的函数式接口(基本都在java.util.function包中)7.6.2函数式接口Runnable接口在java.lang包中,Comparator接口在java.util包中。函数式接口抽象方法函数描述符说明Runnablevoidrun()()->void启动一个线程,运行run()方法中的代码Comparator<T>intcompare(To1,To2)(o1,o2)->int比较两个参数的顺序,返回负整数,零或正整数Predicate<T>booleantest(T)(T)

->boolean判断是否满足条件,常用于筛选元素Consumer<T>voidaccept(T)(T)

->void消费者接口,完成一个对象操作,无需返回值Supplier<T>Tget()()

->T生产者接口,获取指定的结果Function<T,R>Rapply(T)(T)

->R函数形式,一个输入,产生一个输出结果【问题分析】根据题意,可以利用Java语言提供的比较器Comparator<T>,通过java.util包中的数组封装类Arrays.sort()方法实现自动排序。本题目中是对员工对象进行排序,需要我们自己定义排序规则,比较器Comparator<T>就可以实现这个功能。并且该比较器也是一个函数式接口,所以也可以Lambda表达式的形式实现。Example7_08.java【例7.8】现有一个公司的员工列表,请按给定要求排序后输出员工信息:按年龄从大到小排序,如果年龄相同则按员工号从小到大排序。

7.6.2函数式接口C目录ONTENTS7.2

实现接口7.3接口与多态7.4接口的设计与使用7.5

接口的功能扩展7.6Lambda表达式7.1接口7.7枚举7.8小结如果一个对象的所有值可以一一列举出来,则称为枚举。在Java中,枚举类型也是一个类,用枚举类的变量表示枚举值。Java定义了一个基础枚举类Enum,任何枚举类都是这个类的子类。使用枚举可以提高程序的清晰性和可读性。7.7枚举7.7.1简单的枚举类enum枚举名{枚举常量表列}定义枚举类后,就可以定义枚举变量了。枚举变量的定义形式:枚举名枚举变量表列;定义的语法形式:【例7.9】显示一个星期中每一天的工作效率。Example7_09.java枚

温馨提示

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

评论

0/150

提交评论