《2022年抽象类和接口区别用法 .pdf》由会员分享,可在线阅读,更多相关《2022年抽象类和接口区别用法 .pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、引言一个软件设计的好坏在很大程度上取决于它的设计模式,而任何一个设计模式都是和抽象分不开的。从面向对象设计思想来看,复用的重点应该是抽象层的复用,而不是具体某个代码块的复用。Java 抽象类和接 IEI 代表的就是抽象类型,是我们需要提出的抽象层的具体表现。二者作为实现抽象层定义的两种重要机制具有很大的相似性,但在实际应用中又有本质的区别。1 抽象类与接口的概念l,1 什么是抽象类在面向对象的概念中,所有的对象都是通过类来描绘的,但并不是所有的类都是用来描绘对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类用来表示我对问题领域进行分析后得出的抽象概念,是对一
2、系列看上去不同、但本质上相同的具体概念的抽象。比如我们要开发一个管理乐器的软件,会发现问题领域存在着笛子、古筝等一些具体概念,它们是不同的,但都属于乐器,这里的乐器就是一个抽象概念。下面将乐器定义为抽象类:abstract class Instrument pub1ic abstract void play();public abstract void adjust()public String what()return Instrument”I名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 6 页 -我们知道,类可以被实例化生成多个对象来使用,但抽象类不能被实例化,因为它包含了
3、没有方法体只有方法声明的抽象方法。如上例中的 play()和 adjust(),没有提供任何实现,因为每一种乐器的演奏和调节方式都是不同的,所以这些方法的实现细节只能在具体乐器中体现。因此抽象类必须被继承,其中的抽象方法是强制子类必须实现的。12 什么是接口(J av a编程思想中认为接口是纯的抽象类,即接口也是抽象的、不能被实例化的,更重要的是接口中的方法都是抽象的,这些方法要到实现这个接口的类中去实现。接口的本质是在 classes 之间建立起一个协议,它只负责规定执行这个协议的类要实现哪几个方法,具体如何实现是由各个实现类自己决定的。下面通过一个例子来理解接口:interfaceNewC
4、ellPhone voidplayNetworkGame()l voidtakePicture()I 该接口为手机设计了2 个可供实现的方法:打游戏、照相,这2 个方法都是抽象的,没有涉及特殊手机的任何细节,也没有涉及这些操作的具体实现。若某一款手机希望具备这2 项功能,则该手机必需为这 2 个方法提供特定的实现机制。总之,接口使我们只需要关心所要名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 6 页 -完成的功能,无需关心实现的细节。2 抽象类与接口的相同点抽象类和接口都位于继承树的上层,它们具有以下相同点:1)都代表系统的抽象层。2)都不能被实例化。3)都包含抽象方法。现在有
5、很多时论提倡用接口代替抽象类,两者从理论上可以做一般性的混用,但在实际应用中仍存在一定的区别。3 抽象类与接口的不同点31 从语法定义上区分抽象类由 abstract关键字来修饰,接口由 interface关键字来修饰。抽象类中除了有抽象方法外,也可以有数据成员和非抽象方法;而接口中所有的方法必须都是抽象的,接口中也可以定义数据成员,但必须是常量。交际上,抽象类是一种特殊的类,它能包含一个类能包含的任何东西,而接口是类的抽象,它只能包含常量和抽象方法。从语法定义上看,抽象类的优势比较突出。抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,提高代码的可重用性,而接口不可以,这也
6、是抽象类的优点所在。这个优点很有用,扩展功能时,在抽象父类中加入具体方法不会影响子类的实现。而在接口中加入抽象方法会影响到所有实现类,这显然是接口的缺点。32 从编程思想上区分从编程的角度来看,接口的优势比较突出。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 6 页 -1)接口允许非层次类型框架构造(接口允许多重继承)。Java 语言中,一个类只能继承一个直接的父类,这种单继承性为类构造了一个层次类型的框架;而一个接口可以继承多个父接口,这种多继承性构造出的是一个非层次类型的框架。虽然类的层次框架结构清晰,却可能在使用抽象类时形成错综复杂的继承体系,接口的多继承性正好可以解决这
7、个问题。使用接口来定义行为能有效地分离行为与实现,使代码容易维护。2)接口是定义混合类型的理想选择(类可以实现多个接口)。由于 Java类的单继承性,抽象类作为类型定义 l 具的效能大打折扣。在这一点上,接口的优势就很明显。任何一个实现丁某个接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现多个接口,从而这个类就有了多种类。所以接口是定义混合类型的理想工具。33 从设计理念上区分抽象类和接口的本质区别就体现在设计理念不同。接口和抽象类的存在就是为了用于具体类的实现和继承的。具体类和抽象类之间的关系是“is a”,即二者在概念本质上应该是相同的。比如,把动物定义成一个抽象类,猫和狗都
8、属于动物,可由抽象类继承出来。而具体类与接口的关系是“is like a”,它不要求接口的实现者和接口定义在概念本质上是一致的,接口只是一种协议,每个实现接口的类都必须设计遵守这个协议。下面再通过一个例子加以说明。假设有一支可以听收音机的笔,叫做RadioPen。如果我们通过对问题领域的分析名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 6 页 -得知,RadioPen 在概念本质上是一支笔,只是具有听收音机的功能,那么我们可以这样做:1)定义一个抽象类 P e n:abstract class Pen abstract void write();2)定义一个接口 R a di
9、0:interface Radio void receiveRadio();3)定义类 RadioPen继承 Pen并实现 Radio:classRadioPen extends Pen implements Radio void write();voidreceiveRadio()相反,如果 RadioPen 在概念本质上是一个收音机,只是添加了写字的功能,那么把 R adi0 定义为抽象类,把 Pen定义为接口,而 RadioPen继承 Radi0 且实现 Pen即可。可见,抽象类和接口的设计意图是不同的。抽象类是在概念上为具体类提供了一个模式框架,而接口是在功名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 6 页 -能上为具体类提供了一个可供实现的协议。4 结论通过对 Java 抽象类和接口的分析比较得知,它们之间有很大的相似性,但又存在本质的区别。对于它二者的选择,可以反映出设计人员对问题领域中的概念本质的理解是否正确,以及对设计意图的把握是否准确。通常,在实现抽象层的定义时是将二者结合起来以发挥各自的优势。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 6 页 -
限制150内