Java:接口和抽象类,傻傻分不清楚?


再来聊聊接口和抽象类。

01、抽象类和接口的区别

来看网络上对接口的一番解释:

接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。

兄弟们,你们怎么看,这段解释把我绕得晕乎乎的,好像喝过一斤二锅头。到底是解释抽象类呢还是接口呢?傻傻分不清楚。

搞不清楚要用抽象类还是接口,就先来看看两者之间的区别。来,抽象类和接口,你俩过来比比身高。

  1. 抽象类中的方法可以有方法体,能实现方法具体要实现的功能,但是接口中的方法不行,没有方法体。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,并且是隐式的,缺省的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法的。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

02、进一步剖析接口和抽象类

好像知道了两者之间的区别,但印象还是有些模糊。没关系,我们进一步深入。

抽象类

抽象类体现了数据抽象的思想(不然呢),是实现多态的一种机制。抽象类定义了一组抽象的方法,至于这组抽象方法的具体表现形式由子类来继承实现。

抽象类就是用来继承的,否则它就没有存在的任何意义。举个例子,我们来定义一个抽象的作者类。

abstract class Author {abstract void write ();public void sleep () {System.out.println("吃饭睡觉打豆豆");}
}

作为一名作者,本职工作就是搞写作的,其他时间就吃饭睡觉打豆豆;但至于能写出什么样的作品,就要看是哪一个作者了。比如说,沉默王二能写出的作品一定是幽默风趣的。

public class Wanger extends Author {@Overridevoid write() {System.out.println("沉默王二的作品《Web 全栈开发进阶之路》,读起来轻松惬意");}}

注意到了没?抽象类是可以有自己的方法的,但继承它的子类可以忽视。

接口

接口是一种比抽象类更加抽象的“类”,毕竟是用关键字 interface 声明的,不是用 class

接口只是一种形式,就好像一纸契约,自身不能做任何事情。但只要某个类实现了这个接口,就必须按照这纸契约来办事:接口里提到的方法必须全部实现,少一个都不行(抽象类的子类可以忽视非抽象方法)。举个例子,我们来定义一个北航出版合同的接口。

interface ContractBeihang {void scriptBeihang();
}

一旦作者签订了合同,那么就必须定期完成一定量的书稿。

public class Wanger extends Author implements ContractBeihang {@Overridevoid write() {System.out.println("作品《Web 全栈开发进阶之路》,读起来轻松惬意的技术书");}@Overridepublic void scriptBeihang() {System.out.println("一年内完成书稿啊,不然要交违约金的哦。");}}

接口是抽象类的补充,Java 为了保证数据的安全性不允许多重继承,也就是说一个类同时只允许继承一个父类(为什么呢?请搜索关键字“菱形问题”)。

但是接口不同,一个类可以同时实现多个接口,这些接口之间可以没有多大的关系(弥补了抽象类不能多重继承的缺陷)。比如说,沉默王二不仅签了北航出版社的合同,还和 51CTO 签了付费课程的合同。

public class Wanger extends Author implements ContractBeihang, Contract51 {@Overridevoid write() {System.out.println("作品《Web 全栈开发进阶之路》,读起来轻松惬意的技术书");}@Overridepublic void scriptBeihang() {System.out.println("一年内完成书稿啊,不然要交违约金的哦。");}@Overridepublic void script51() {System.out.println("王老师,先把 Java 云盘的大纲整理出来。");}}

03、接口和抽象类之间的差别

通过上面举的例子,是不是对接口和抽象类有比较清晰的认知了?如果还没有,来来来,我们再来比较一下接口和抽象类之间的差别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PyHUoyLM-1573712761900)(http://www.itwanger.com/assets/images/2019/11/java-interface-abstract-1.png)]

究竟什么时候使用接口,什么时候使用抽象类呢?

1、抽象类表示了一种“is-a”的关系,而接口表示的是“like-a”的关系。也就是说,如果 B 类是 A(沉默王二是一个作者),则 A 应该用抽象类。如果 B 类只是和 A 有某种关系,则 A 应该用接口。

2、 如果要拥有自己的成员变量和非抽象方法,则用抽象类。接口只能存在静态的不可变的成员变量(不过一般都不在接口中定义成员变量)。

3、为接口添加任何方法(抽象的),相应的所有实现了这个接口的类,也必须实现新增的方法,否则会出现编译错误。对于抽象类,如果添加了非抽象方法,其子类却可以坐享其成,完全不必担心编译会出问题。

4、抽象类和接口有很大的相似性,请谨慎判断。Java 从1.8版本开始,尝试向接口中引入了默认方法和静态方法,以此来减少抽象类和接口之间的差异。换句话说,两者之间越来越难区分了。

04、接口的实际应用

在实际的开发应用当中,抽象类我用得不多(这可真是大实话);接口我倒是用得蛮多的,就像下面这样子:

public interface CityMapper {@Select("select * from city")List<City> getCitys();}

@Insert@Update@Delete@Select 被称为 Mybatis 的注射器注解。

是不是突然感觉有点懵?之前还在谈接口和抽象类,怎么一下子跳跃到 Mybatis 上面了呢?还有什么映射器注解?

嗯,这就对了。所有的理论知识都要应用于实践,否则也就没有了存在价值。在我的实践应用当中,接口用得最多的就是 MybatisMapper 接口。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解(就是你在前面见到的增删改查四大注解)来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

当我们配置好了 MyBatis 环境后,可以直接通过以下语句来调用注射器接口。

@Service
public class CityService {@Autowiredprivate CityMapper cityMapper;public void init() {List<City> citys = cityMapper.getCitys();}}
}

在注射器接口中,也只会存在那些与数据库查询相关的抽象方法,就像你看到的 List<City> getCitys();。一个注射器接口 + 注射器注解就可以增删改查数据库,是不是感觉很神奇?

05、总结

这篇文章的目的是帮助更多的读者了解和掌握抽象类、接口的特点,以及不同的使用场景。

上一篇:再谈 Java 的继承和超类 Object

下一篇:Java 生成二维码分享海报

谢谢大家的阅读,原创不易,喜欢就随手点个赞👍,这将是我最强的写作动力。如果觉得文章对你有点帮助,还挺有趣,就关注一下我的公众号「沉默王二」。

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

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

相关文章

css弹性布局和网格布局

css布局 一、知识补充 1. 浮动的特性 只会影响后面的元素文本不会被浮动元素覆盖&#xff08;浮动的特性就是图文混合&#xff09;具备内联盒子特性&#xff1a;宽度由内容决定具备块级盒子特性&#xff1a;支持所有样式浮动放不下&#xff0c;会自动折行 template: <d…

系统架构师(二)案例题

目录 一、软件结构设计 &#xff08;一&#xff09;软件质量属性 &#xff08;二&#xff09;风险&#xff0c;敏感点&#xff0c;权衡点 二、结构化软件系统建模 &#xff08;一&#xff09;流程图和数据流图 &#xff08;二&#xff09;实体和类的区别 &#xff08;三…

链表的定义和使用

1.链表概念&#xff1a; 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 //通俗的说&#xff1a;链表就是由一个个节点组成&#xff0c;这些节点逻辑上连续&#xff0c;物理上不连续&#xff09; 2.链表的类型&am…

做一个Python颜值打分系统,比比看杨幂和杨超越到底谁更美?

下面就来讲讲我设计的这套颜值打分系统,先上图片让大家看一下效果,比如看一下我的女神杨幂的颜值如何: 怎么样,结果是相当的精准吧,大家是不是已经跃跃欲试了呢?下面就针对该颜值打分系统进行讲解。 01. 注册百度API 该系统最为核心的部分就是颜值的打分,这里其实是直…

二叉树的定义和使用

1.二叉树概念&#xff1a; 树的定义&#xff1a; 树是一种抽象数据类型&#xff0c;用来模拟具有树状结构性质的数据集合。它是由n&#xff08;n>0&#xff09;个有限节点通过连接它们的边组成一个具有层次关系的集合&#xff08;根朝上&#xff0c;而叶朝下&#xff09;。…

量化交易入门先看这几种常见的策略分类

量化交易的本质是对数据的处理和内在规律的探索&#xff0c;本文简要概括了市场上常见的量化策略类型&#xff0c;并给出了对应的例子。希望能帮助大家构建对量化策略的整体认识。 一起开始今天的学习吧~ 涉及到的市场 主要指传统二级市场&#xff0c;一般指股票二级市场和期…

QMT量化交易软件使用攻略(二)-策略编写

【策略编辑器】是迅投专门为模型开发者设计的&#xff0c;集成了模型列表、函数列表、函数帮助、模型基本信 息、参数设置、回测参数等多个部分&#xff0c;拥有代码高亮、自动补全等便捷功能于一体的便捷的模型编辑、 开发环境 编写 Python 策略需在开始时定义编码格式&#x…

电脑如何剪辑视频?自学视频剪辑的朋友看过来

相比于手机来说&#xff0c;很多专业人士喜欢在电脑剪辑视频多一点&#xff0c;毕竟电脑的配置高&#xff0c;很多专业的视频剪辑、制作工具都是要在电脑上使用的。现在&#xff0c;有越来越多人加入到这个行业中来&#xff0c;在短视频行业中要想持续发展的话&#xff0c;不掌…

推荐几个方法教你学会怎样制作视频剪辑

随着时代的发展&#xff0c;新媒体行业的壮大&#xff0c;应该不少小伙伴每天都需要制作视频剪辑吧&#xff0c;有些可能是因为从事短视频行业&#xff0c;每天就需要发送视频内容&#xff0c;才能吸引观众&#xff0c;也有些可能只是想单纯分享一些生活视频。那你知道如何制作…

视频剪辑怎么自学?其实剪辑很简单

视频剪辑怎么自学&#xff1f;现如今短视频发展十分迅速&#xff0c;几乎人人都在参与其中。相信大家在日常生活中也是会拍摄一些好看好玩的视频的。那么我们在整理视频的时候也是可以将其剪辑成一段好看的片段的。可能很多小伙伴们还不是很清楚剪辑视频的方法&#xff0c;这里…

毕业季 拍大师教你制作另类毕业视频

又是一年的毕业季&#xff0c;各路亲朋好友、师弟师妹们都过来围观&#xff0c;让青春的末班车留下了很多动人又雷人的画面。一琢磨&#xff0c;用拍大师把这段青春的美好回忆做成了一个MV视频&#xff0c;打上离别时想对童鞋们说的话&#xff0c;定格的回忆画面瞬间让童鞋们泪…

LLM 系列 | 08: 如何用ChatGPT构建点餐机器人?

简介 风蒲猎猎小池塘&#xff0c;过雨荷花满院香&#xff0c;沉李浮瓜冰雪凉。小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖铁观音的小男孩。 更多、更新文章欢迎关注 微信公众号&#xff1a;小窗幽记机器学习。后续会持续整理模型加速、模…

华为面试题目:一头牛重800kg,一座桥承重700kg,牛如何过河?天秀回答秒通过...

一头牛重800kg&#xff0c;一座桥承重700kg&#xff0c;牛如何过河&#xff1f; 最近随着几档职场真人秀的热播&#xff0c;一些职场类的话题也接二连三地被推上热搜&#xff0c;引起大家的广泛热议。尤其是在春招如此激烈的环境下&#xff0c;与招聘有关的新闻更是受到大家的热…

《Tritium投研报告》冥王星(Plutos)——基于Solana、Polkadot和BSC跨链合成资产发行交易平台

​点击上方蓝字关注我们 该报告为Tritium Ventures独家投研报告&#xff0c;报告内容仅供参考&#xff0c;不作为投资建议或投资依据。 先说结论&#xff1a; 项目上线不久&#xff0c;目前价格与估值偏低。但是由于其属性和未来逐步上线的功能会逐渐吸引用户得到相应发展。尤其…

谷歌的最新NLP模型,现在能陪你从诗词歌赋谈到人生哲学

水木番 发自 凹非寺 量子位 报道 | 公众号 QbitAI 继BERT之后&#xff0c;谷歌在NLP模型上又有大动作&#xff01; 在今天的谷歌I/O大会上&#xff0c;一口气发布了2个新模型&#xff1a; LaMDA和 MUM&#xff0c;均基于Transformer架构。 LaMDA&#xff08;对话应用程序的语言…

新征程,新视野,TOP主网开启新时代!

2006年1月19日美国东部时间下午2点&#xff0c;美国国家航空航天局(NASA)的“新视野&#xff08;New Horizons&#xff09;”号航天器从佛罗里达沿岸发射升空&#xff0c;开始了载入史册的漫长旅程。 “新视野&#xff08;New Horizons&#xff09;”号航天器的发射是人类历史…

冥王星轨道发现不明生命 全世界都惊呆了

据美国宇航局官方最新消息&#xff0c;新视野号探测器在去年完成了对冥王星的飞掠&#xff0c;创造了人类史上的第一次&#xff0c;这里距离地球48多亿公里&#xff0c;NASA飞船整整飞了九年的时间才抵达。 进入冥王星飞掠轨道时&#xff0c;全世界都屏住了呼吸&#xff0c;我们…

更安全的使用体验,微软宣布第一台带有安全冥王星芯片的PC

继10月发布的Windows 11之后&#xff0c;微软上周宣布了第一款采用Pluton芯片到云安全技术的PC。该技术旨在保护远程工作人员和其他人的计算机。 在CES上&#xff0c;微软宣布联想和芯片制造商AMD已经推出了第一款笔记本电脑——ThinkPad Z13和ThankPad Z16——它们原生了冥王星…

WxGL应用实例:绘制高精度的3D太阳系模型

文章目录 1 坐标系的选择1.1 黄道坐标系1.2 三维空间直角坐标系 2 使用JPL星历表计算轨道2.1 日期时间2.2 特定时刻天体的位置2.3 天体运行轨道 3 太阳系模型3. 1 太阳和八大行星全家福3.2 时间、距离和半径的缩放3.3 黄道坐标系模型 天何所沓&#xff1f;十二焉分&#xff1f;…

冥王星P的编曲日志《我们就这样溺死在漩涡里》

这次做的是偏金属的摇滚&#xff0c;因为自己学啥啥不行就想写首歌抨击内卷。写出来发现基底竟然有点neru的味道&#xff0c;于是就参考neru的《再教育》对旋律进行了一些改造和优化。 在这里插入图片描述 乐器配置以吉他为主&#xff0c;配上一个不是那么金属的贝司和明亮的钢…