再来聊聊接口和抽象类。

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 生成二维码分享海报

谢谢大家的阅读,原创不易,喜欢就随手点个赞

Java:接口和抽象类,傻傻分不清楚?相关推荐

  1. java接口和抽象类的区别(经典面试题)

    java接口和抽象类的区别(经典面试题) 要了解接口和抽象类的区别,首先需要明白接口和抽象类的定义. 1.抽象类 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可 ...

  2. 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类 (转)

    老帖了,但是还是想自己收录一下.最后也把自己对于这个问题的一些粗糙的理解记录下来. 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的.在这种情况下,各个对象内部是如何实现自己的对 ...

  3. java接口和抽象类的区别和作用

    java接口和抽象类的区别和作用 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过(implements)接口的方 ...

  4. 选择Java接口还是抽象类

    很多人有过这样的疑问:为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种 ...

  5. java 接口与抽象类的区别

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  6. Java 接口和抽象类可以被new么?

    背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和抽象类可以被new嘛?".这可能不是考官的原话,但是据他表达考官大概就是这个意思了.听到这个问题,我的第一反应是肯定不 ...

  7. Java 接口和抽象类可以被new么?——顺便总结内部类

    转载:https://blog.csdn.net/hackersaillen/article/details/47281549 背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和 ...

  8. java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别

    .前言 JAVA是一种面向对象语言,具备抽象(Abstract),封装(packing),继承(extends),多态(polymorphic)四大特性. 我们重点从oop思想∠来分析. .在面向对象 ...

  9. 抽象类中不能有private的成员_【java基础】-- java接口和抽象类的异同分析

    在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题.下面我来谈谈自己的理解.如有不妥之处,还望批评指正,不胜感激. 1.抽象类怎么定义和继承? 2.接口怎么定义和实现? 3. ...

最新文章

  1. 翼方健数曹华:构建数据和计算互联网的必由之路
  2. iOS - UnitTests 单元测试
  3. android从放弃到精通 第12天 勿忘初心
  4. Report Style
  5. spring cloud微服务分布式云架构-commonservice-config配置服务搭建
  6. 六级词汇打卡第天四天(四)
  7. Android 开发之 bindService() 通信
  8. 《Java核心技术 卷1》
  9. 从打造“兴趣电商”到“完全闭环”,抖音电商之路
  10. 什么是AOP(通俗易懂)
  11. 微软统一打补丁的服务器,明白打补丁! 微软公布2月Win10/Win8.1/Win7更新详情
  12. 中兴通讯刀片服务器,中兴通讯发布行业首个OLT内置刀片技术白皮书
  13. java与jasper模板_ireport中使用java进行pdf转化,jasper作为模板
  14. windows 下连服务器
  15. 基于深度学习的遥感影像语义分割数据预处理
  16. 眼动和脑波相关性分析和回归分析
  17. 基础计算机教学论文,计算机基础教学论文范文
  18. Pivotal的数字转型经:授之于鱼不如授之于渔
  19. 【TypeScript】条件语句
  20. 【玩转微信公众平台之一】序章(纯粹扯淡)

热门文章

  1. sqlite 超小白笔记
  2. 一体化时代又要来临了。
  3. Nginx安装配置Lua支持
  4. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)
  5. 倾城之恋_拔剑-浆糊的传说_新浪博客
  6. 计算机网络——ARQ协议
  7. 使用WCDB中踩过的坑
  8. linux远程管理工具之tabby
  9. 银企对账系统软件测试,银联对账系统自动化测试的设计与实现
  10. 无基础学python需要多少小时-Python要学习多久能入门?精通需要多久?