接口与抽象类的区别(包括JDK8新特性)
Posted Ferron Zhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口与抽象类的区别(包括JDK8新特性)相关的知识,希望对你有一定的参考价值。
1、概念
抽象类:Java的核心就是面向对象,在面向对象的程序设计中,万物皆对象,所有的对象都应该用类来描述,但是并不是所有的类都是用来描述对象的。因为很多时候大部分对象都不能直接被描述,当一个类难于有足够的信息来描述一个具体的对象时,我们通常把它定义为抽象类,用关键字abstract
来修饰。因此,凡是用关键字abstract
修饰的类都是抽象类,凡是用关键字abstract
修饰的方法都是抽象方法,抽象类不一定要拥有抽象方法,抽象方法一定在抽象类里面。
接口:广义上来说,接口算是一个只包含抽象方法的抽象类,但是严格上并不能这样说,因为接口不是直接说是抽象类,抽象类是包含属性和方法,而接口则是包含了类要实现的方法。接口在Java中算是一种抽象类型,是许多抽象方法的集合。接口需要用关键字interface
来修饰。
2、区别
- 抽象类可以有构造方法和普通成员变量,接口没有构造方法和普通成员变量,只能有
static final
关键字修饰的静态常量 - 抽象类可以有非抽象的普通方法,而对于接口来说,JDK8之前,接口只能有一系列的抽象方法;而在JDK8之后,接口不仅仅可以包含抽象方法,还可以包含默认方法和静态方法。
- 一个类可以实现多个接口,但只能继承一个抽象类
- 抽象类中方法可以被所有关键字修饰,但是抽象方法只可以被
public
,protected
,default
关键字来修饰,不能用private
修饰。JDK8之前,抽象类的方法默认访问权限为protected
,JDK8以后,抽象类的方法默认访问权限变为default
。而对于接口来说,JDK8之前,所有的抽象方法访问权限必须是public
,JDK8时,抽象方法访问权限可以为public
和default
,JDK9及之后,抽象方法访问权限也可以是private
。
3、其他
-
接口和抽象类的区别,本质上就是类和一系列抽象方法的集合的区别,抽象类可以有构造方法,普通方法,也可以有普通成员变量,而接口只能有静态常量和抽象方法(默认方法和静态方法)。
-
实际开发中,接口更像是一种开发规范,由架构师设计好了接口之后,再由项目开发团队分别把这些接口逐一去实现;而抽象类更多的是在具体代码实现方面发挥作用。
-
JDK8之后接口之所以要添加默认方法的原因,是因为当接口的实现类要实现接口时,需要重写接口里面的全部方法,这使接口与实现类的耦合度过高。因此如果需要给接口添加一个新的方法时,所有的实现类都需要修改,而默认方法可以实现为接口添加新的方法,并且不改变原有对接口的实现。
-
抽象类中的抽象方法不能用
private
修饰,因为抽象类中的抽象方法就是为了被子类重写而存在的,所以不能用private
修饰。
以上是关于接口与抽象类的区别(包括JDK8新特性)的主要内容,如果未能解决你的问题,请参考以下文章