接口与抽象类的区别(包括JDK8新特性)

Posted Ferron Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口与抽象类的区别(包括JDK8新特性)相关的知识,希望对你有一定的参考价值。

1、概念

抽象类:Java的核心就是面向对象,在面向对象的程序设计中,万物皆对象,所有的对象都应该用类来描述,但是并不是所有的类都是用来描述对象的。因为很多时候大部分对象都不能直接被描述,当一个类难于有足够的信息来描述一个具体的对象时,我们通常把它定义为抽象类,用关键字abstract来修饰。因此,凡是用关键字abstract修饰的类都是抽象类,凡是用关键字abstract修饰的方法都是抽象方法,抽象类不一定要拥有抽象方法,抽象方法一定在抽象类里面。

接口:广义上来说,接口算是一个只包含抽象方法的抽象类,但是严格上并不能这样说,因为接口不是直接说是抽象类,抽象类是包含属性和方法,而接口则是包含了类要实现的方法。接口在Java中算是一种抽象类型,是许多抽象方法的集合。接口需要用关键字interface来修饰。

2、区别

  1. 抽象类可以有构造方法和普通成员变量,接口没有构造方法和普通成员变量,只能有static final关键字修饰的静态常量
  2. 抽象类可以有非抽象的普通方法,而对于接口来说,JDK8之前,接口只能有一系列的抽象方法;而在JDK8之后,接口不仅仅可以包含抽象方法,还可以包含默认方法和静态方法。
  3. 一个类可以实现多个接口,但只能继承一个抽象类
  4. 抽象类中方法可以被所有关键字修饰,但是抽象方法只可以被publicprotecteddefault关键字来修饰,不能用private修饰。JDK8之前,抽象类的方法默认访问权限为protected,JDK8以后,抽象类的方法默认访问权限变为default。而对于接口来说,JDK8之前,所有的抽象方法访问权限必须是public,JDK8时,抽象方法访问权限可以为publicdefault,JDK9及之后,抽象方法访问权限也可以是private

3、其他

  • 接口和抽象类的区别,本质上就是类和一系列抽象方法的集合的区别,抽象类可以有构造方法,普通方法,也可以有普通成员变量,而接口只能有静态常量和抽象方法(默认方法和静态方法)。

  • 实际开发中,接口更像是一种开发规范,由架构师设计好了接口之后,再由项目开发团队分别把这些接口逐一去实现;而抽象类更多的是在具体代码实现方面发挥作用。

  • JDK8之后接口之所以要添加默认方法的原因,是因为当接口的实现类要实现接口时,需要重写接口里面的全部方法,这使接口与实现类的耦合度过高。因此如果需要给接口添加一个新的方法时,所有的实现类都需要修改,而默认方法可以实现为接口添加新的方法,并且不改变原有对接口的实现。

  • 抽象类中的抽象方法不能用private修饰,因为抽象类中的抽象方法就是为了被子类重写而存在的,所以不能用private修饰。

以上是关于接口与抽象类的区别(包括JDK8新特性)的主要内容,如果未能解决你的问题,请参考以下文章

接口接口优点接口的属性和方法特性接口与继承的区别接口与抽象类的区别匿名实现类JDK1.8新特性打印类名称

《JDK8新特性专题》-02接口中默认方法和静态方法

抽象类和接口有什么区别

JDK8新特性 Lambda表达式

(转)Java接口与抽象类的区别

JDK8 新特性