相同之处
- 接口和抽象类都不能被实例化,只能被其他类实现和继承
- 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类必须实现这些抽象方法
不同之处
从设计层面来说
抽象是对类的抽象,是一种模板设计,接口是对行为的抽象,是对行为的规范
从组成上来说
- 接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。
- 接口里只能定义公共静态常量,不能定义普通成员变量;抽象类既可以定义普通成员变量也可以定义静态常量。
- 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
- 接口里不能包含初始化;但抽象类则完全可以包含初始化块
从用法上来说
一个类最多只能有一个父类,包括抽象类;但一个类可以实现多个接口
补充
- 抽象类是从多个类中抽象出来的模板,接口是更彻底的抽象,接口定义了多个类共同的行为规范,接口实现了规范与实现分离
- 一个接口可以有多个父接口,但接口只能继承接口,不能继承类
- JDK8 的时候接口可以有默认方法和静态方法功能。
- JDK9 在接口中引入了私有方法和私有静态方法。
- 私有方法主要作用就是作为工具方法使用,为接口中的类方法和默认方法提供支持。Java8允许在接口中定义带方法体的抽象方法和类方法,当两个默认方法或者类方法中包含一段相同的实现逻辑时,程序必然考虑将这段实现逻辑抽取成工具方法,而工具方法应该是被隐藏的
- 默认方法允许在不破坏已使用接口的代码的情况下,在接口中增加新的方法。
来源:51CTO
作者:季沉Trace
链接:https://blog.51cto.com/13646338/2478221