抽象类与接口的区别

文章目录

  • 抽象类的理解
  • 接口的理解
  • 区别分析
  • 演示案例
  • 总结
  • 参考

抽象类的理解

动物就是对某类事物的普遍性、共同性进行抽取后得到的用来反映这类事物本质的概念。
动物被定义为靠摄取有机物(植物、动物或微生物)来获得营养而不能完成无机物到有机物转化过程的能够对环境作出反应并移动的生物。

动物其实是对一大类事物进行抽象得到的概念,这种概念还是比较笼统的,那么在 Java 语言中,则将动物这种事物抽象成一个抽象类(即声明定义一个抽象类来描述动物这种事物)

猫是对某类具体的事物进行抽象得到的具体概念,那么在 Java 语言中,则将猫这种事物抽象成一个具体类(即声明定义一个具体类来描述猫这类具体的事物)

接口的理解

行为是对各种事物表现出来的外表活动进行抽象得到的概念,这种概念同样是笼统的。就算是更具体的概念“飞行”,其实对于不同种的事物而言,“飞行”的具体内容也是有很大区别的。例如,人类的飞行是通过滑翔伞,或者喷气式飞行设备;鸟的飞行则是通过自身的翅膀。所以在 Java 语言中,适合将某类事物的各种行为/动作抽象成一个接口(声明定义一个接口(纯抽象类)来描述各种事物的行为/动作)。

在软件中接口是一种规范(标准/约定/协议),接口可以约束类的行为,接口是一些方法特征的集合,但是没有方法的实现,接口其实上也可以看做是一个特殊的抽象类,但是两者的设计理念完全不同,抽象类有利于代码复用,接口利于代码的扩展和维护。

接口通过抽象方法来描述一组行为规范

接口(interface)不是一个类,它是抽象方法的集合。一个类实现一个接口,从而继承和实现接口的抽象方法。

区别分析

抽象类是对一种事物的抽象,而接口是对行为的抽象。抽象类是对某种事物整体进行抽象,包括属性、行为,但是接口只是对事物的某些行为进行抽象。

类描述对象的属性和行为。接口仅仅约定了事物的行为。

举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类
Airplane,将鸟设计为一个抽象类 Bird,但是不能将“飞行”这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将“飞行”设计为一个接口 Fly,包含方法 fly(),然后 Airplane 和 Bird 分别根据自己的需要实现 Fly 这个接口。至于有不同种类的飞机,比如战斗机、民用飞机等直接继承 Airplane 即可,对于鸟也是类似的,不同种类的鸟直接继承 Bird 类即可。从这里可以看出,继承是一个 "是不是"的关系,而接口实现则是 "有没有"的关系。继承解决"是不是"的问题,接口解决“有没有”的问题。

比如某种生物如果属于鸟类,那么就是继承 bird,这种生物是否有“飞行”这种特点呢?能飞行则可以实现这个接口 Fly,不能飞行就不实现这个接口。

演示案例

门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以通过抽象类或者接口来声明(描述)这两个抽象概念。

抽象类:

abstract class Door {public abstract void open();public abstract void close();
}

接口:

interface Door {public abstract void open();public abstract void close();
}

现在有个需求,有些门具有报警功能,那么该如何实现这样的需求呢?

将 open() 、close() 和 alarm() 都声明在一个接口中,行不行?
我们分析下:
有些门具有报警功能,那么去实现这个接口就可以了;而有些门不具有报警功能,但是具有基本的 open()、close() 功能,难道也去实现这个接口吗?如果去实现这个接口,那么就必须实现 alarm(),这并不符合需求呀。如果将来需要做个火灾报警器,这个报警器具有 alarm() 功能,但是不具有 open()、close() 功能,火灾报警器为了实现报警的功能去实现这个接口,结果还要额外将 open()、close() 这两种功能也实现了,这样显然不合理呀。

而将这三个功能都声明在一个抽象类中,也会遇到上述的问题。

所以从这里可以看出,open() 、close() 和 alarm() 根本就属于两个不同范畴内的行为,open() 和 close() 是门本身固有的行为特性,而 alarm() 属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含 alarm() 行为,Door 设计为单独的一个抽象类,包含 open 和 close 两种行为。再设计一个报警门继承 Door 类和实现 Alarm 接口。

interface Alram {void alarm();
}abstract class Door {void open();void close();
}class AlarmDoor extends Door implements Alarm {void oepn() {//....}void close() {//....}void alarm() {//....}
}

总结

不管使用抽象类还是接口,归根结底是为了尽可能地职责分离,把业务抽象,也就是“面向接口编程”。

参考

抽象类的理解参考文章:
1.https://www.cnblogs.com/dolphin0520/p/3811437.html
2.https://blog.csdn.net/qq_45151158/article/details/123785005
3.https://blog.csdn.net/chenssy/article/details/12858267
4.https://www.runoob.com/w3cnote/java-abstract-interface-different.html

接口的理解参考文章:
1.https://blog.csdn.net/m0_61220535/article/details/123436292
2.https://blog.51cto.com/u_3664660/3214698
3.https://segmentfault.com/a/1190000040932698
4.https://zhuanlan.zhihu.com/p/271073878?ivk_sa=1024320u
5.https://gitbook.cn/books/5a237e8d508755657b690914/
6.https://blog.csdn.net/qq_40587575/article/details/78793885
7.https://www.cnblogs.com/otakus/p/12169072.html
8.https://developer.51cto.com/article/469310.html
9.https://blog.csdn.net/kwame211/article/details/77374710
10.https://www.sohu.com/a/352592926_99950532
11.https://ld246.com/article/1552317815323

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅尝硬盘分区表

【0】README 0.1) text description from orange’s implemention of a os; 0.2) there are a number of analysis and attention proves to be essence of this page, I think; 0.3)Conclusion about hd partition table C1…

openjdk-7支持版本_长期支持对OpenJDK意味着什么?

openjdk-7支持版本Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持(LTS)的问题,这表明对它的真正含义仍有一些困惑。 在此博客文章中,我将解释不同部分如何组合在一起。 那么……谁说或在哪里说“ #OpenJDK 11”是LTS&…

android 安装卸载应用提醒_Android监听程序的安装和卸载

在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataStr…

常用函数式接口的学习

文章目录定义常用的函数式接口Supplier演示代码Consumeraccept 方法演示代码andThen 方法演示代码Predicatetest 方法and 方法演示代码or 方法negate 方法Functionapply 方法演示代码andThen 方法演示代码定义 有且仅有一个抽象方法的接口称之为“函数式接口”,但是…

如何创建虚拟硬盘 + os 读取硬盘参数代码

【0】README 0.1) 本文旨在演示如何利用 bximage 创建虚拟硬盘;0.2) 利用 os 读取硬盘参数, source code from orange’s implemention of a os , for complete code , please visit https://github.com/pacosonTang/Orange-s-OS…

内联脚本被视为是有害的_数据类被认为有害

内联脚本被视为是有害的这篇博客文章解释了从我参与的项目之一中删除Lombok项目的动机。 它反映了我的个人观点,并不妨碍特定的技术。 大约三年前,我认识了Project Lombok ,这是一个添加Java代码的库。 我从一开始就喜欢它,因为它…

win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...

Haley 于2020/08/24更新 磁盘分区管理摘要文中介绍了两种方法充分利用Windows10未分配空间,分别为1)格式化Win10未分配空间来创建新的分区,2)在分区上添加未分配空间。我的Win 10计算机上有一个大小99GB的未分配空间 :「我在Windows计算机上安装了两个硬…

selenium编写脚本_Selenium脚本编写技巧和窍门

selenium编写脚本如果您刚刚开始学习Selenium,则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识,将帮助您记住所有这些。 您只需浏览一次,几秒钟后您便会了解所有内容。 让我们一一看一下所有的技巧和窍门。 …

div和div之间画横线_HTML如何在两个div标签中间画一条竖线

近日在画一个界面的时候,遇到一个需求:在界面当中画一条竖线,且这条竖线在高度上需要自动占满整个父div(即这条竖线的高度和两个div中较高的一个等高)。往常我们画一条横线直接用标签即可,当画一条竖线的时候发现找不到标签。在网…

静态类型/静态分派/动态分派/单分派/多分派

文章目录静态类型/实际类型方法解析静态分派动态单分派参考静态类型/实际类型 Human woman new Woman(); // Human就是静态类型,其实就是变量编译时类型,Woman就是实际类型 Man man new Man(); // 静态类型和实际类型都是Man方法解析 Class 文件的编…

jvm回收垃圾_没有垃圾回收的JVM

jvm回收垃圾JVM社区不断增加新的GC,最近又添加了一个新的GC,它被称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&…

C打印函数printf的一种实现原理简要分析

【0】README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用;0.2) vsprintf 和 printf.c 的源码,参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统:Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具,需要自己安装安装命令:sudo apt install tcpxtract使用方法…

java设计模式适配器模式_Java中的适配器设计模式

java设计模式适配器模式适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。 在设计一个面向对象的应用程序时,当我们的客户期望一个特…

技术路线的选择重要但不具有决定性

微软在技术上连续大动作,如果放在几年前,我相信微软粉丝们一定是欢声雷动,不过这次情况有点不太一样,在网上看到有人在抱怨微软技术更新速度太快而且四面出击,还有人扬言要改弦更张,投奔Linux或者Java阵营。…

nproc是什么意思_top/htop内容的含义

uptimeuptime命令显示了load avg,它其实是读取的/proc/uptime文件:/proc/uptime 文件cat /proc/uptime9592411.58 9566042.33第一个是系统启动了多久(单位s),第二个意思是系统启动以来,cpu idle花费的时间(单位s)。多核机器上&…

进程间通信(IPC)+进程加锁解锁

【0】README 0.1) source code and text description are from orange’s implemention of a os;0.2) for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/ipc_8 【1】看看,我们的进程代…

QA与测试到底有什么区别?

文章目录引言QA与测试的区别?QA、QC、QM的关系与区别?QA工作内容与职责引言 近期微信公众号后台有同学留言问: QA与测试的区别? QA、QC、QM的区别?以及QA的工作内容与职责。 针对这些问题我查阅了一些资料然后结合自…

java 进程运行时间_将Java类作为子进程运行

java 进程运行时间我本周需要将Java类(而不是jar)作为子进程运行。 更确切地说,我想从测试内部产生一个新进程,而不是直接在测试内部(进程内)运行它。 我不认为这是幻想或复杂的事情。 但是,这不…

划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信

实验拓扑如下:VPC 26 IP 23.1.1.3 24 VLAN20VPC 25 IP 12.1.1.2 24 VLAN10VPC1 IP 12.1.1.1 24 VLAN10VPC2 IP 23.1.1.2 24 VLAN20IOL交换机命名为SW1 先配置SW1的vlan10 和20检查SW1的vlan信息配置SW1的vlan10 和20检查SW2的vlan信息下一步将SW1和SW2连接的接口改为…