Java 8 中的接口和抽象类到底有啥区别?

开发 后端
Java 8 中的接口和抽象类的区别除了接口中可以写实现方法之外这点变化,其他的还是保持不变的。

[[347098]]

 在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就 OUT 啦,要跟上形式。

这个问题我在面试一个 39 岁的程序员时,他居然也没回答上来,其实了解 Java 8 的同学应该都知道,Java 8 在接口中推出了默认方法、静态方法,打破了接口只能写抽象方法的传统,如果你还不知道的可以点击阅读我之前发的这篇文章。

既然接口都能写实现方法了,那么还要抽象类干嘛呢?Java 8 中的接口和抽象类到底还有啥区别?大家是不是都有困惑?

所以,栈长这篇带大家分析一下,不一定全,但希望对你有用。

区别1:

首先抽象类是一个“类”,而接口只是一个“接口”,两者的概念和应用场景不一样,这也是抽象类和接口的主要区别。

区别2:

即使在 Java 8 中接口也能写实现方法了,但却不能写构造方法,而在抽象类是可以写构造方法的,意味着抽象类是参与类的实例化过程的,而接口则不是。

区别3:

抽象类可以有自己的各种成员变量,并且可以通过自己的非抽象方法进行改变,而接口中的变量默认全是 public static final 修饰的,意味着都是常量,并且不能被自己和外部修改。

区别4:

接口可以实现多继承,而抽象类只能单继承。

下面我举两个例子:

  1. public class HashMap<K,V> extends AbstractMap<K,V> 
  2.     implements Map<K,V>, Cloneable, Serializable { 
  3.     ... 
  4. }     
  1. public interface Connection  extends Wrapper, AutoCloseable { 
  2. ... 

类与类只能单继承,而类与接口、接口与接口可以多继承。

总结

Java 8 中的接口和抽象类的区别除了接口中可以写实现方法之外这点变化,其他的还是保持不变的。

既然接口可以写方法实现了,那么抽象类的存在貌似是弱化了,因为类只能是单继承,耦合性不好,而接口可以多实现,可以灵活扩展,也不会增加类的耦合性。

虽然说是少用继承,多用组合的设计理念,但继承的场景也还是存在的,比如我们常用的模板设计模式就是抽象类和各种模板的子类,所以说,接口也不能完全代替抽象类的。

你认为抽象类的应用场景还有哪些呢?欢迎留言分享!

本文转载自微信公众号「Java技术栈 」,可以通过以下二维码关注。转载本文请联系Java技术栈公众号。

 

责任编辑:武晓燕 来源: Java技术栈
相关推荐

2011-07-10 14:07:59

JAVA

2009-06-16 11:30:00

Java抽象类Java接口

2009-06-14 21:31:29

Java抽象类Java接口

2011-12-22 10:48:21

Java

2011-05-19 18:01:56

JAVA

2011-07-12 15:58:48

java抽象类接口

2009-04-30 15:15:01

Java抽象类接口

2021-12-23 07:11:31

开发

2011-06-28 10:55:20

C#接口抽象类

2021-12-31 09:23:22

SDNSD-WAN网络技术

2012-02-29 09:32:01

Java

2015-09-07 14:31:33

云计算SDNNFV

2011-07-06 10:33:31

C#

2015-02-13 10:24:51

2010-03-04 09:40:04

Java接口抽象类

2015-03-23 09:33:43

Java抽象类Java接口Java

2020-02-07 10:55:37

抽象类接口秒懂

2024-03-29 11:39:57

用户画像用户分群用户分层

2023-07-03 08:10:51

2022-10-27 19:32:20

切片golang数组
点赞
收藏

51CTO技术栈公众号