- 3
- 0
- 约5.76千字
- 约 4页
- 2023-06-01 发布于上海
- 举报
java接⼝使⽤场景_java抽象类和接⼝的区别,使⽤场景
在Java语⾔中, abstract class 和interafce是⽀持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强⼤的 ⾯向对象
能⼒。abstract class和interface之间在对于抽象类定义的⽀持⽅⾯具有很⼤的相似性,甚⾄可以相互替换,因此很多开发者在进 ⾏抽象
类定义时对于abstract class和interface的选择显得⽐较随意。其实,两者之间还是有很⼤的区别的,对于它们的选择甚⾄反映出对 于问
题领域本质的理解、对于设计意图的理解是否正确、合理。本⽂将对它们之间的区别进⾏⼀番剖析,试图给开发者提供⼀个在⼆者之间进⾏
选择的依据。
理解抽象类
abstract class和interface在Java语⾔中都是⽤来进⾏抽象类(本⽂ 中的抽象类并⾮从abstract class翻译⽽来,它表⽰的是⼀个抽象体,
⽽abstract class为Java语⾔中⽤于定义抽象类的⼀种⽅法, 请读者注意区分)定义的,那么什么是抽象类,使⽤抽象类能为我们带来什么
好处呢?
在 ⾯向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是⽤来描绘对象的,如果⼀
个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。抽象类往往⽤来表征我们在对问题领域进⾏分析、 设计中得出
的抽象概念,是对⼀系列看上去不同,但是本质上相同的具体概念的抽象。⽐如:如果我们进⾏⼀个图形编辑软件的开发,就会发现问题领
域存在着圆、 三⾓形这样⼀些具体概念,它们是不同的,但是它们⼜都属于形状这样⼀个概念,形状这个概念在问题领域是不存在的,它
就是⼀个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以⽤以表征抽象概念的抽象类是不能够实例化的。
在⾯向对象领域,抽象类主要⽤来进⾏类型隐藏。 我们可以构造出⼀个固定的⼀组⾏为的抽象描 述,但是这组⾏为却能够有任意个可能的
具体实现⽅式。这个抽象描述就是抽象类,⽽这⼀组任意个可能的具体实现则表现为所有可能的派⽣类。模块可以操作⼀个 抽象体。由于
模块依赖于⼀个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派⽣,也可扩展此模块的⾏为功能。熟悉OCP的读者
⼀定知 道,为了能够实现⾯向对象设计的⼀个最核⼼的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
从语法定义层⾯看abstract class 和 interface
在语法层⾯,Java语⾔对于abstract class和interface给出了不同的定义⽅式,下⾯以定义⼀个名为Demo的抽象类为例来说明这种不
同。
使⽤abstract class的⽅式定义Demo抽象类的⽅式如下:
abstract class Demo {
abstract void method1();
abstract void method2();
…
}
使⽤interface的⽅式定义Demo抽象类的⽅式如下:
interface Demo{
void method1();
void method2();
…
}
在abstract class⽅式中,Demo可以有⾃⼰的数据成员,也可以有⾮ abstract的成员⽅法,⽽在interface⽅式的实现中,Demo只能够
有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中⼀般不定义数据成员),所有的成员⽅法都是abstract
的。从某种意义上说,interface是⼀种特殊形式的 abstract class。
从编程的⾓度来看,abstract class和interface都可以⽤来实现 design by contract 的思想。但是在具体的使⽤上⾯还是有⼀些区别
的。
⾸先,abstract class 在 Java 语⾔中表⽰的是⼀种继承关系,⼀个类只能使⽤⼀次继承关系(因为Java不⽀持多继承 -- 转注)。但是,⼀
个类却可以实现多个interface。也许,这是Java语⾔的设计者在考虑Java对于多重继承的⽀持⽅⾯的⼀种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予⽅法的默认⾏为。但是在interface的定义中,⽅法却不能拥有默认⾏为,为了绕过这个限
制,必须使⽤委托,但是这会增加⼀些复杂性,有时会造成很⼤的⿇烦。
在 抽象类中不能定义默认⾏为还存在另⼀个⽐较严重的问题,那就是可能会造成维护上的⿇烦。因 为如果后来想修改类的
原创力文档

文档评论(0)