Java 8 中的接口和抽象类到底有啥区别?
Java技术栈
www.javastack.cn
关注阅读更多优质文章
上一篇栈长发了这篇《Java 8 有多牛逼?打破一切你对接口的认知!》,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇:
在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就 OUT 啦,要跟上形式。
这个问题我在面试一个 39 岁的程序员时,他居然也没回答上来,其实了解 Java 8 的同学应该都知道,Java 8 在接口中推出了默认方法、静态方法,打破了接口只能写抽象方法的传统,如果你还不知道的可以点击阅读我之前发的这篇文章。
既然接口都能写实现方法了,那么还要抽象类干嘛呢?Java 8 中的接口和抽象类到底还有啥区别?大家是不是都有困惑?
所以,栈长这篇带大家分析一下,不一定全,但希望对你有用。
区别1:
首先抽象类是一个“类”,而接口只是一个“接口”,两者的概念和应用场景不一样,这也是抽象类和接口的主要区别。
区别2:
即使在 Java 8 中接口也能写实现方法了,但却不能写构造方法,而在抽象类是可以写构造方法的,意味着抽象类是参与类的实例化过程的,而接口则不是。
区别3:
抽象类可以有自己的各种成员变量,并且可以通过自己的非抽象方法进行改变,而接口中的变量默认全是 public static final
修饰的,意味着都是常量,并且不能被自己和外部修改。
区别4:
接口可以实现多继承,而抽象类只能单继承。
下面我举两个例子:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
...
}
public interface Connection extends Wrapper, AutoCloseable {
...
}
类与类只能单继承,而类与接口、接口与接口可以多继承。
总结
Java 8 中的接口和抽象类的区别除了接口中可以写实现方法之外这点变化,其他的还是保持不变的。
既然接口可以写方法实现了,那么抽象类的存在貌似是弱化了,因为类只能是单继承,耦合性不好,而接口可以多实现,可以灵活扩展,也不会增加类的耦合性。
虽然说是少用继承,多用组合的设计理念,但继承的场景也还是存在的,比如我们常用的模板设计模式就是抽象类和各种模板的子类,所以说,接口也不能完全代替抽象类的。
你认为抽象类的应用场景还有哪些呢?欢迎留言分享!
最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。
- datepicker小插件(日期时间 & 日期 & 月份)
- 封装好的MAP工具类和HBASE工具类
- JSP+ajax+springMVC+MayBatis处理excel上传导入
- 绚丽的javascript拾色器(不兼容IE8及以下)
- 魔波广告恶意病毒简析
- javascript生成.xls文件(兼容IE&Chrome&Firefox)
- 没用的程序设计题-美甲帮笔试题
- MongoDB Java
- JSON.parse()和JSON.stringify()
- jquery获取主机地址和端口
- 前端验证码绘制(canvas)
- 关于机器学习在网络安全中的五大误解
- 打造专属插件之Easy Slider Bar
- java asm 框架 浅析
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 不要在Spring单元测试中使用 @Transactional注解
- OpenCV DNN模块官方教程(一)加载Caffe模型做图像分类
- Python爬虫之mongodb的聚合操作
- Linux中文输入法-搜狗输入法安装方法
- oracle 数据库问题:"ORA-01922: 必须指定 CASCADE 以删除...",原因及解决办法
- OpenCV DNN模块官方教程(二)YoloV4目标检测实例
- Python爬虫之mongodb的增删改查
- 恕我直言你可能真的不会java第2篇:Java Stream API?
- Python爬虫之mongodb的简单使用
- Java之美-死锁
- 恕我直言你可能真的不会java第4篇:Stream管道流Map操作
- 高工也要补基础,wait,notify,join
- 恕我直言你可能真的不会java第5篇:Stream的状态与并行操作
- 恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑
- 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?