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