Java抽象类和接口

上传人:ni****g 文档编号:568587899 上传时间:2024-07-25 格式:PPT 页数:34 大小:220KB
返回 下载 相关 举报
Java抽象类和接口_第1页
第1页 / 共34页
Java抽象类和接口_第2页
第2页 / 共34页
Java抽象类和接口_第3页
第3页 / 共34页
Java抽象类和接口_第4页
第4页 / 共34页
Java抽象类和接口_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《Java抽象类和接口》由会员分享,可在线阅读,更多相关《Java抽象类和接口(34页珍藏版)》请在金锄头文库上搜索。

1、Core Java抽象类和接口Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类与抽象方法抽象类与抽象方法n抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类;n抽象类必须被继承。n抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(final类)正好相反。n抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。n抽象方法必须被重写n抽象方法只有声明,不能有实现。n定义了抽象方法的类必须是抽象类。nabstract returnType abstractMethod ( paramlist );两个类Circle和Rectangle,完成相关参数

2、的计算 class Rectangle public float width,height; Rectangle (float w, float h) width = w; /这里不需这里不需this height = h; public float area() return width*height; class Circle public float r; Circle(float r) this.r = r; /this指指这个对象的这个对象的 public float area() return 3.14*r*r; Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类与抽象

3、方法抽象类与抽象方法n假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的。n如果还有其它形状:Triangle,Ellipses等,上述方法显得“累赘”。我们希望有一种统一的表示,例如用一个数组shape,接受所有的形状,然后用:for (i=0; ishape.length; i+) area_total += shapei.area();Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类与抽象方法抽象类与抽象方法abstract class Shape abstra

4、ct float area();class Rectangle extends Shape public float width,height; Rectangle (float w, float h) width = w; /这里不需这里不需this height = h; public float area() return width*height; class Circle extends Shape public float r; Circle(float r) this.r = r; /this指指这个对象的这个对象的 public float area() return 3.14

5、*r*r; Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类与抽象方法抽象类与抽象方法抽象类和最终类声明抽象类与抽象方法publicabstractclassPlaneGraphics1/平面图形类,抽象类publicabstractdoublearea();/计算面积,抽象方法,分号“;”必不可少使用abstract关键字抽象方法只有方法声明,没有方法体抽象类和最终类规定:抽象类不能被直接实例化,只有它的非抽象子类可以创建对象抽象类中不一定包含抽象方法,但有抽象方法的类必定是抽象类抽象类中的抽象方法只是声明,不包含方法体,即不给出方法的实现构造方法、类方法不能声明为抽象方法抽象

6、类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类抽象类和最终类抽象类的意义:描述抽象的概念,规定必须实现的方法的统一接口关于抽象类和抽象方法Abstracttest.java抽象类和最终类最终类和最终方法final关键字修饰的类称为最终类,最终类不能被继承final关键字修饰的方法称为最终方法,最终方法不能被覆盖最终方法和最终类没有必然的对应关系Java中的接口中的接口 入门知识入门知识1 1、含义:、含义: 一组只有成员函数原型定义而无成员函数定义体的方一组只有成员函数原型定义而无成员函数定义体的方法集。法集。 接口定义了一组成员函数,但没有具体加以实现,其接口定义了一组成

7、员函数,但没有具体加以实现,其实现则是由实现该接口的类来加以具体完成的。实现则是由实现该接口的类来加以具体完成的。2 2、作用:、作用:为若干个类(相关或无关的类)定义一组相同的功能行为,为若干个类(相关或无关的类)定义一组相同的功能行为,从而达到相同的功能名称,不同的功能实现之目的;从而达到相同的功能名称,不同的功能实现之目的;另外也可以实现类似另外也可以实现类似C+C+语言中的多重继承但又避免了虚语言中的多重继承但又避免了虚基类的编程。基类的编程。接口的概念接口的概念 在构建问题的类过程中,我在构建问题的类过程中,我们经常会遇到一种特殊的情况,在们经常会遇到一种特殊的情况,在描述某个类的各

8、个方法时,对每个描述某个类的各个方法时,对每个方法我们只能给出其功能实现的要方法我们只能给出其功能实现的要求(原形声明)但不能给出具体的求(原形声明)但不能给出具体的功能实现(函数定义体)。功能实现(函数定义体)。 因为我们所处理的问题只是因为我们所处理的问题只是一个一个泛泛的功能说明泛泛的功能说明,并没有针对,并没有针对某一具体类型的问题来说明。某一具体类型的问题来说明。 设计出实现图像显示功能的设备时设计出实现图像显示功能的设备时,可以只给出功能实现的要求可以只给出功能实现的要求显示图像显示图像 调整图像调整图像 在投影仪中实现在投影仪中实现显示图像显示图像调整图像调整图像在电视机中实现在

9、电视机中实现显示图像显示图像调整图像调整图像您觉得接口您觉得接口抽象吗?抽象吗?接口定义格式接口定义格式q要要点点:类类似似于于类类的的定定义义格格式式,只只是是以以 interfaceinterface作作为为定定义义符。符。q格式:格式:接口的类型接口的类型interfaceinterface接口名接口名 常量(常量(并且必须初始化并且必须初始化 );); 成员方法定义(成员方法定义(只有原形而无函数定义体只有原形而无函数定义体 );); 或:或:接接口口的的类类型型interface interface 派派生生的的接接口口名名extends extends 父父接接口口名名列列表表 接

10、口中的成员变量定义;接口中的成员变量定义; 接口中的成员方法原型定义;接口中的成员方法原型定义; 实现接口实现接口q方法:方法: 通过定义一个类同时采用通过定义一个类同时采用implements来指明所实来指明所实现的接口名,并在该类中重写接口中的现的接口名,并在该类中重写接口中的所有成员方法所有成员方法且且给出成员函数体定义。给出成员函数体定义。q要点要点v类中所实现的接口中的成员函数的原型都应该与它在类中所实现的接口中的成员函数的原型都应该与它在 接口中的原型定义保持一致;接口中的原型定义保持一致;v并在类中重写接口中的并在类中重写接口中的所有所有成员方法;成员方法;v通过实现接口,从而可

11、扩充或增加该类的功能。通过实现接口,从而可扩充或增加该类的功能。v接接口只定义方法名,而类实现口只定义方法名,而类实现接接口内部的方法的代码口内部的方法的代码v接接口的继承只是继承接口本身,而非代码,从而不会口的继承只是继承接口本身,而非代码,从而不会产生重复继承多次。产生重复继承多次。 一个类可以实现多个接口实现接口的类必须给出接口中所有方法的具体实现!除非这个类是抽象类 接口的作用接口的作用接口提供了完全的抽象说明所有实现该接口的类应具有的形式接口中的方法在多个实现接口的类中表现出多态性 接口回调接口回调接口也是引用数据类型,指向接口的引用也可以指向任意实现了该接口的类创建的实例接口回调,

12、即接口的引用可以指向实现了接口的类的实例例子:Interfacetest.java注意程序实例程序实例interface Computerinterface Computer public void public void ComputeDataComputeData();(); / /计算机应该有数据计算的功能计算机应该有数据计算的功能public void public void SaveDataSaveData();(); / /计算机应该有存储数据的功能计算机应该有存储数据的功能public void public void PrintDataPrintData(); (); / /计

13、算机应该有打印数据的功能计算机应该有打印数据的功能public void public void DisplayDataDisplayData();(); / /计算机应该有显示数据的功能计算机应该有显示数据的功能 定义出接口定义出接口, ,实现只给出实现只给出功能的描述功能的描述在设计在设计PCPC机时来实现它自己的功能机时来实现它自己的功能class class PCComputerPCComputer implements Computer implements Computer / /实现它的计算、存储和打印数据、显示数据的功能实现它的计算、存储和打印数据、显示数据的功能public

14、void public void ComputeDataComputeData()() public void public void SaveDataSaveData()() public void public void PrintDataPrintData()() public void public void DisplayDataDisplayData()() SunSun公司在公司在SolarisSolaris机中实现它的功能机中实现它的功能class class SunSolarisComputerSunSolarisComputer implements Computer im

15、plements Computer Sun Sun在设计在设计SolarisSolaris机时实现它的功能机时实现它的功能public void public void ComputeDataComputeData()() public void public void SaveDataSaveData()() public void public void PrintDataPrintData()() public void public void DisplayDataDisplayData()() 抽象类和接口的对比抽象类和接口的对比q接口和类是很相似但又有区别的一种数据结构,其设接口和

16、类是很相似但又有区别的一种数据结构,其设计和调用也是计和调用也是JAVA程序设计的一种重要技术。程序设计的一种重要技术。q从结构上看,接口有如下特点:从结构上看,接口有如下特点:接口用接口用interface来定义,而不是来定义,而不是class接口中定义的变量去全部是最终的静态变量接口中定义的变量去全部是最终的静态变量接口中没有自身的构造方法,不能创建实例,而定接口中没有自身的构造方法,不能创建实例,而定义的义的 其他方法全是抽象方法,即提供了方法的定义,其他方法全是抽象方法,即提供了方法的定义,但是没有提供方法的实现。但是没有提供方法的实现。接口采用多重继承机制,而不是采用单一的继承机接口

17、采用多重继承机制,而不是采用单一的继承机制。制。 接口与抽象类的区别抽象类和接口中主要关心的都是抽象,而不关心具体的实现。但也有一些区别:一个类只能继承一个类,但可以实现多个接口抽象类表示一种继承关系,接口只说明功能二者的区别主要体现在对问题域的理解上抽象类的应用抽象类的应用abstract class Person private int ID;private String Name;public abstract void Eat(Food obj);public void Step(Feet obj)public void Sleep()在在描描述述某某一一个个问问题题时时,如如果果只只

18、能能给给出出部部分分的的功功能能实实现现,而而不不能能给给出出全全部部的的功功能能实实现现时时,应应该该采采用用抽抽象象类来描述。类来描述。接口接口的应用的应用interface TVinterface TV public public intint Size=29; Size=29;public abstract void public abstract void showImageshowImage();();public abstract void public abstract void setChannelsetChannel();();public public abstract

19、abstract void void receiveImagereceiveImage();();在描述某一个问题时,如果不能给出任在描述某一个问题时,如果不能给出任何的功能实现,应该采用接口来描述。何的功能实现,应该采用接口来描述。内部类声明内部类在一个类中包含另一个类的定义内部类可以在类、方法甚至语句块中定义内部类可以是private或protected的见例子:TestGoods.java在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。Content代表着Goods的内容,而GDesti

20、nation代表着Goods的目的地。它们分别实现了两个接口Content和Destination。在后面的main方法里,直接用Contentsc和Destinationd进行操作,你甚至连这两个内部内部类的类的名字都没有看见!这样,内部类的内部类的第一个好处就体现出来了隐藏你不想让别人知道的操作,也即封装性。同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。上例中的cont()和dest()方法就是这么做的。那么还有没有别的方法呢?当然有,其语法格式如下:outerObject=newouterClass(ConstructorParam

21、eters);outerClass.innerClassinnerObject=outerObject.newInnerClass(ConstructorParameters);注意在创建非静态内部类对象时,一定要先创建起相应的外部类对象。至于原因,也就引出了我们下一个话题非静态内部类对象有着指向其外部类对象的引用,对刚才的例子稍作修改:TestGoods1.java注意在修改的代码里我们给Goods类增加了一个private成员变量valueRate,意义是货物的价值系数,在内部类Content的方法value()计算价值时把它乘上。我们发现,value()可以访问valueRate,这也是

22、内部类的内部类的第二个好处一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!这是一个非常有用的特性,为我们在设计时提供了更多的思路和捷径。要想实现这个功能,内部类对象就必须有指向外部类对象的引用。Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外想要创建内部类对象必须先创建其外部类对象的原因。有人会问,如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用:outerClass.t

23、his有了它,我们就不怕这种屏蔽的情况了。内部类关于内部类关于内部类非静态内部类具有指向其外部类的引用,可以访问外部类中的成员,当内部类中定义了与外部类同名的成员时,可以使用“宿主类的名称.this.成员”的格式访问外部类的成员。内部类可以被定义为静态的,静态内部类没有指向外部类的引用,只能访问外部类的类成员。任何非静态内部类中不能有静态数据、静态方法或者静态内部类。内部类内部类作用与接口一起实现完整的多重继承内部类作用InnerClass.java内部类具有访问外部类的引用/内部类引用外部类的成员内部类引用外部类的成员public class Inner2public class Inner

24、2 class class aaaa intint a=1; a=1;class bbclass bb intint b=2; b=2;class ccclass cc /这对括号必须有,因为类中语句必须包含在一个代码块或方法体中这对括号必须有,因为类中语句必须包含在一个代码块或方法体中intint b=4; b=4;intint c=3; c=3;System.out.println(ccSystem.out.println(cc););System.out.println(cc.cSystem.out.println(cc.c=+c);=+c);System.out.println(bb.

25、bSystem.out.println(bb.b=+bb.this.b);/=+bb.this.b);/内部类引用内部类引用外部类成员外部类成员System.out.println(aa.aSystem.out.println(aa.a=+=+aa.this.aaa.this.a);); 内部类匿名内部类当只需创建一个类的对象而用不上它的名字时,可以使用匿名内部类匿名内部类由于没有名字,所以它没有带名字的构造函数java的匿名内部类的内部类的语法规则看上去有些古怪,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:newinterface

26、name().;或newsuperclassname().;有一点需要注意的是,匿名内部类由于没有名字,所以它没有带名字的构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:如果是在一个方法内部的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。将匿名内部类改造成有名字的局部内部类,这样它就可以拥有有名字的构造函数了。在这个匿名内部类中使用初始化代码块。例子:Test.java匿名内部类实例匿名内部类实例cla

27、ss class PackBoxPackBox interface Goods /interface Goods /定义内部接口定义内部接口 String String getNamegetName();(); Goods Goods SportShoeSportShoe () () return new Goods()return new Goods()/匿名内部类匿名内部类String name = String name = 运动鞋运动鞋;intint price = 200; price = 200;public String public String getName()return

28、getName()return name; name; /事实上匿名内部类必须继承一个类或实现一个接口事实上匿名内部类必须继承一个类或实现一个接口内部类小结为什么需要内部类?为什么需要内部类?java内部类内部类有什么好处?为什么需要内部类?首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。不过你可能要质疑,更改一下方法的不就行了吗?的确,以此作为设计内部类的内部类的理由,实在没有说服力。真正的原因是这样的,java中的内部类和接口加在一起,可以解决常被C+程序员抱怨java中存在的一个问题没有多继承。实际上,C+的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。练习练习q正确设置正确设置“人人”问题中的问题中的“工作工作”接口接口q在在“工作工作”接口中包含有如下的行为定义接口中包含有如下的行为定义沟通沟通职位升迁职位升迁完成任务指标完成任务指标

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 文学/艺术/历史 > 人文/社科

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号