问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

接口和抽象类在面向对象编程中有什么作用

发布网友 发布时间:2022-04-30 02:17

我来回答

1个回答

热心网友 时间:2022-04-13 06:24

在OOD(面向对象设计)中,经常会用到抽象类或接口,【注:在C++中,没有接口的概念,只有抽象类;而在Java中两者都存在】。而在使用过程中,也许会有不少人认为接口和抽象类差不多,然后就想当然地觉得可以相互完全替换。事实上,虽然他们有很多相似点,但也有很大差异。
1.抽象类与接口的出现条件
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题 领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可 以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读 者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
2.从语法定义层次上区分abstract class和interface
在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:
abstract class Demo_A { abstract void method1();
abstract void method2();

}

使用interface的方式定义Demo抽象类的方式如下:
interface Demo_I {
void method1();
void method2();

}

在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的、不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊 形式的abstract class。
从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。为了绕过这个*,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
3.从设计理念层次上区分abstract class和interface
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。接下来将从abstract class和interface所反映出的设计理念,来分析一下二者的区别。从这个层面进行分析更能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
使用abstract class方式定义Door:
abstract class Door_A {
abstract void open();
abstract void close();
}

使用interface方式定义Door:
interface Door_I {
void open();
void close();
}

其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 机械键盘t轴是什么轴 大家店铺是怎么运营的呢?? 村上春树的书中哪本最好,好在哪里? 村上春树最好的书是哪本? 男友天天和我在一起,但是他的朋友圈突然从三天改为半年是什么意思? 突然朋友圈设置半年可见的人 急急,我男朋友,之前的朋友圈一直是半年可见,我的也是半年可见,但是最近他突然给改成全部开放了? 男生朋友圈由一个月可见改成半年可见,代表什么?就有两组他自己的照片 但是是看不到脸的那种_百度问一问 一个男的突然把朋友圈仅一个月可见变成了半年可见是什么心理?难道是他对象要求的? 一个男生突然把朋友圈仅半年可见(这半年他什么都没发,什么都没有)改为全部可见,最早发的也是2019_百度问一问 男的以前朋友圈开放的,和我表白那晚突然变成半年可见? 一个男生突然把朋友圈仅半年可见(这半年他什么都没发,什么都没有)改为全部可见,最早发的也是2019_百度问一问 一个男孩子突然把朋友圈设置成最近半年可见,是怎么回事 男生突然朋友圈全部开放变为半年什么心理??- 问一问 一个男的突然把朋友圈仅一个月可见变成了半年可见是什么心理? 饼干的英语的音标怎么读 《迷砂》拼音怎么写 饼干英文怎么读语音 饼干的英文读音 烟雨江湖伙伴可以比主角高几级? 破釜沉舟告诉人们一个什么道理 Java中的抽象类和接口有什么不同,又有什么作用? 韩信为何会落得身死的下场,从中我们可以得到哪些启示? 为什么要使用抽象类和接口 项目中接口和抽象类各自起什么作用? java中抽象类和接口存在的意义是什么 java中的抽象类和接口该怎么理解 ?定义上有什么区别?通常分别有什么作用? 什么是接口?接口有哪些好处,抽象类(abstract)和接口(interface)的区别... 第五套人民币价格是多少钱? 第五套人民币的价格 oracle 12c插入一条记录的时候提示对表空间‘USERS’无权限 猪脚汤锅的做法大全 在网上如何购买人寿保险 吃汤锅的最好食材? 用炖锅可以做什么美食 购买人寿保险有哪些注意事项?如何购买人寿保险? 汉邦高科嵌入式DVR原始密码是多少- 问一问 手机充电宝通用吗 汉邦高科硬盘录像机HB7024初始用户名跟密码是多少? hame充电宝充电线是否可以通用