《Java程序设计教程》课件第八章:抽象类、接口和枚举.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Java程序设计教程》课件第八章:抽象类、接口和枚举.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计教程 Java 程序设计 教程 课件 第八 抽象 接口 枚举
- 资源描述:
-
1、本章学习目标:掌握抽象类的定义、应用和特点掌握接口的定义、应用和特点理解枚举类的定义和应用第八章第八章 抽象类、接口和枚举抽象类、接口和枚举第第1 1节节part抽象类 在定义类时,并不是所有的类都能够完整地描述该类的行为。在某些情况下,只知道应该包含怎样的方法,但无法准确地知道如何实现这些方法时,可以使用抽象类。抽 象 类本节概述 抽象类是对问题领域进行分析后得出的抽象概念,是对一批看上去不同,但是本质上相同的具体概念的抽象。例如,定义一个动物类Animal,该类提供一个行动方法action(),但不同的动物的行动方式是不一样的,如牛羊是跑的,鱼儿是游的,鸟儿是飞的,此时就可以将Animal
2、类定义成抽象类,该类既能包含action()方法,又无须提供其方法的具体实现。这种只有方法头,没有方法体的方法称为抽象方法。定义抽象方法只需在普通方法上增加abstract修饰符,并把普通方法的方法体全部去掉,并在方法后增加分号即可。抽象类和抽象方法必须使用“abstract”关键字来修饰,其语法格式如下:【访问符】abstract class 类名 【访问符】abstract 方法名(参数列表);8.1.1抽象类的定义抽象类的定义 有抽象方法的类只能被定义为抽象类,但抽象类中可以没有抽象方法。定义抽象类和抽象方法的规则如下:(1)abstract关键字放在class前,指明该类是抽象类。(2
3、)abstract关键字放在方法的返回值类型前,指明该方法是抽象方法。(3)抽象类不能被实例化,即无法通过new关键字直接创建抽象类的实例。(4)一个抽象类中可以有多个抽象方法,也可以有实例方法。(5)抽象类可以包含成员变量、构造方法、初始化块、内部类、枚举类和方法等,但不能通过构造方法创建实例,可在子类创建实例时调用。(6)定义抽象类有三种情况:直接定义一个抽象类;继承一个抽象类,但没有完全实现父类包含的抽象方法;实现一个接口,但没有完全实现接口中包含的抽象方法。下述代码示例了抽象类和抽象方法的定义,代码如下所示。8.1.1抽象类的定义【代码8.1】Shape.javapackage com
4、;public abstract class Shape private String color;/初始化块 System.out.println(执行抽象类中的初始化块);/构造方法 public Shape()public Shape(String color)this.color=color;System.out.println(执行抽象类中的构造方法);8.1.1抽象类的定义public String getColor()return color;public void setColor(String color)this.color=color;/抽象方法 public abstr
5、act double area();public abstract String getType();上述代码定义了两个抽象方法:area()和getType(),所以这个Shape类只能被定义为抽象类。虽然Shape类包含了构造方法和初始化块,但不能直接通过构造方法创建对象,只有通过其子类实例化。抽象类不能实例化,只能被当成父类来继承。从语义角度上讲,抽象类是从多个具有相同特征的类中抽象出来的一个父类,具有更高层次的抽象,作为其子类的模板,从而避免子类设计的随意性。下述代码定义一个三角形类,该类继承Shape类,并实现其抽象方法,以此示例抽象类的使用。代码如下所示。8.1.2抽象类的使用抽象
6、类的使用【代码8.2】Triangle.javapackage com;public class Triangle extends Shape private double a;private double b;private double c;public Triangle(String color,double a,double b,double c)super(color);this.a=a;this.b=b;this.c=c;Override public double area()/海伦公式计算三角形面积double p=(a+b+c)/2;double s=Math.sqrt(p*
7、(p-a)*(p-b)*(p-c);return s;8.1.2抽象类的使用Override public String getType()if(a=b+c|b=a+c|c=a+b)return 三边不能构成一个三角形;elsereturn 三边能构成一个三角形;public static void main(String args)Triangle t=new Triangle(RED,3,4,5);System.out.println(t.getType();System.out.println(三角形面积为:+t.area();程序运行结果如下:执行抽象类中的初始化块执行抽象类中的构造方
8、法三边能构成一个三角形三角形面积为:6.08.1.2抽象类的使用 当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。而final修饰的类不能被继承,修饰的方法不能被重写,因此,final与abstract不能同时使用。除此之外,static和abstract也不能同时使用,并且抽象方法不能定义为private访问权限。抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一
9、个或多个方法留给子类实现,这就是一种模板模式,模板模式也是十分常见且简单的设计模式之一。下面再介绍一个模板模式的示例,在这个示例的抽象父类中,父类的普通方法依赖于一个抽象方法,而抽象方法则推迟到子类中提供实现。代码如下所示。8.1.3抽象类的作用抽象类的作用【代码8.3】CarSpeedMeterExample.javapackage com;abstract class SpeedMeter private double turnRate;/转速public SpeedMeter()/返回车轮半径的方法定义为抽象方法public abstract double getRadius();pub
10、lic void setTurnRate(double turnRate)this.turnRate=turnRate;/定义计算速度的通用方法public double getSpeed()/速度(KM/H)=车轮周长*转速*3.6return Math.round(3.6*Math.PI*2*getRadius()*turnRate);8.1.3抽象类的作用public class CarSpeedMeterExample extends SpeedMeter Overridepublic double getRadius()return 0.30;public static void m
11、ain(String args)CarSpeedMeterExample csm=new CarSpeedMeterExample();csm.setTurnRate(10);System.out.println(车速为:+csm.getSpeed()+公里/小时);8.1.3抽象类的作用 上面程序定义了一个抽象类SpeedMeter(车速表),该类中定义了一个getSpeed()方法,该方法用于返回当前车速,而getSpeed()方法依赖于getRadius()方法的返回值。对于该抽象类来说,无法确定车轮的半径,因此getRadius()方法必须推迟到子类中来实现。在其子类CarSpeedM
12、eterExample中,实现了父类的抽象方法,既可以创建实例对象,也可以获得当前车速。程序运行结果如下:车速为:68.0公里/小时 下面是使用模板模式的一些简单规则。(1)抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给其子类去实现。(2)父类中可能包含需要调用的其他系列方法的方法,这些被调方法既可以由父类实现,也可以由其子类实现。8.1.3抽象类的作用第第2 2节节part接口 接口定义了某一批类所需要遵守的公共行为规范,只规定这批类必须提供的某些方法,而不提供任何实现。接口体现的是规范和实现分离的设计哲学。让规范和实现分离正是接口的好处,让系统的个模块之间面向接
13、口耦合,是一种松耦合的设计,从而降低各模块之间的耦合,增强系统的可扩展性和可维护性。接 口本节概述8.2.1接口的定义 Java只支持单继承,不支持多重继承,即一个类只能继承一个父类,这一缺陷可以通过接口来弥补。Java允许一个类实现多个接口,这样使程序更加灵活、易扩展。和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的基本语法格式如下:【访问符】interface 接口名 /静态常量定义 /抽象方法定义 /默认方法、类方法、内部类等其他定义 接口的定义8.2.1接口的定义 其中,定义接口要遵守如下规则:(1)访问符可以是public或者默认,默认采用
14、包权限访问控制,即在相同包中才可以访问该接口。(2)在接口体力可以包含静态常量、抽象方法、内部类、内部接口以及枚举类的定义。从Java 8版本开始允许接口中定义默认方法、类方法。(3)与类的默认访问符不同,接口体内定义的常量、方法等都默认为public,可以省略public关键字。(4)接口名应与类名采用相同的命名规范。(5)接口里不能包含构造方法和初始化块。下述代码示例了接口的定义规则,代码如下所示。8.2.1接口的定义【代码8.4】InterfaceDefinition.javapackage com;public interface InterfaceDefinition public
15、final static int SIZE=0;/定义静态常量public abstract void display();/定义抽象方法/定义默认方法,需要default修饰default void print()System.out.println(接口中的默认方法);/定义静态方法static void show()System.out.println(接口中的类方法);/定义内部类class InnerClass/定义内部接口interface MyInnerInterface 8.2.1接口的定义 上述代码中定义了一个接口InterfaceDefinition,并在接口中声明了静态常
16、量、抽象方法、默认方法、类方法、内部类和内部接口。其中:(1)接口中定义的成员变量如果没有声明修饰符,系统会自动为其增加“public static final”进行修饰,即接口中定义的成员变量都是静态常量。(2)接口中定义的方法只能是抽象方法、默认方法和类方法。因此,如果是定义普通方法没有声明修饰符,系统将自动增加“public abstract”进行修饰,即接口中定义的普通方法都是抽象方法,不能有方法体。(3)从Java 8开始,允许在接口中定义默认方法,默认方法必须使用“default”关键字修饰,不能使用“static”关键字修饰。因此,不能直接使用接口来调用默认方法,必须通过接口的实
17、现类的实例对象来调用默认方法,默认方法必须有方法体。(4)从Java 8开始,允许在接口中定义类方法,类方法必须使用“static”关键字修饰,不能使用“default”关键字修饰,类方法必须有方法体,可以直接通过接口来调用类方法。(5)接口中定义的内部类、内部接口以及内部枚举都默认为“public static”。8.2.2接口的实现 接口不能用于创建实例,但接口可以用于声明引用类型变量。当使用接口来声明引用类型变量时,这个引用类型变量必须引用到其实现类的对象。除此之外,接口的主要用途就是被实现类实现。一个类可以实现一个或多个接口,实现则使用implements关键字。由于一个类可以实现多个
18、接口,这也是为Java单继承灵活性不足所做的补充。类实现接口的语法格式如下:【访问符】【修饰符】class 类名 implements 接口名1,接口名2 /类体部分 接口的实现8.2.2接口的实现 其中:(1)访问符、修饰符、class和类名与前面类的声明格式完全相同。(2)implements关键字用于实现接口。(3)一个类可以实现多个接口,接口之间使用逗号隔开。(4)一个类在实现一个或多个接口时,必须全部实现这些接口中定义的所有抽象方法,否则该类必须定义为抽象类。(5)一个类实现某个接口时,该类将会获得接口中定义的常量和方法等。下述代码示例了对前面声明接口的实现,代码如下所示。8.2.2
19、接口的实现【代码8.5】MyInterface.javapackage com;public class MyInterface implements InterfaceDefinition/实现接口中定义的抽象方法public void display()System.out.println(重写接口中的抽象方法);public static void main(String args)/实例化一个接口实现类的对象,并将其赋值给一个接口引用变量InterfaceDefinition myInterface=new MyInterface();/调用接口中的默认方法myInterface.pr
20、int();/访问接口中的静态常量System.out.println(InterfaceDefinition.SIZE);/调用实现类中的方法(对接口中抽象方法的实现)myInterface.display();/调用接口中的类方法InterfaceDefinition.show();8.2.2接口的实现 与抽象类一样,接口是一种更加抽象的类结构,因此不能对接口直接实例化,但可以声明接口变量,并用接口变量指向当前接口实现类的实例。使用接口变量指向该接口实现类的实例对象,这也是多态性的一种体现。程序运行结果如下:接口中的默认方法 0 重写接口中的抽象方法 接口中的类方法8.2.3接口的继承 接
21、口的继承与类的继承不一样,接口完全支持多重继承,即一个接口可以有多个父接口。除此之外,接口的继承与类的继承相似,当一个接口继承父接口时,该接口将获得父接口中国定义的所有方法和常量。一个接口可以继承多个接口时,多个接口跟在extends关键字之后,并用逗号隔开,接口继承语法格式如下:【访问符】interface 子接口名 extends 父接口名1,父接口名2 /子接口新增的常量和方法 下述代码示例了接口的继承和实现,代码如下所示。接口的继承8.2.3接口的继承【代码8.6】InterfaceExtends.javapackage com;interface MyInterfaceA int A
22、=10;void showA();interface MyInterfaceB int B=20;void showB();interface MyInterfaceC extends MyInterfaceA,MyInterfaceB int C=30;void showC();8.2.3接口的继承public class InterfaceExtends implements MyInterfaceC public void showA()System.out.println(实现showA()方法);public void showB()System.out.println(实现show
展开阅读全文