1.抽象类可以有构造方法,接口不能有构造方法
因为抽象类除了不能被实例化以外,其他的特性和类基本相同,
也可以拥有非抽象的方法
,也存在成员变量,抽象类的实现类可以通过调用抽象类的构造方法来对抽象类中的成员变量进行赋值
接口没有成员变量,有的话也只能是静态常量,而且接口中只能有抽象方法,不能有非抽象方法
2.抽象类中可以有普通的成员变量,接口中没有普通的成员变量
同上因为抽象类除了不能被实例化以外,其他的特性和类基本相同,也存在成员变量
接口没有成员变量,有的话也只能是静态常量(public static final)
3.抽象类中可以包含非抽象的普通方法,接口中的方法必须都是抽象的,不能有非抽象的普通方法
这点是两者的概念
4.抽象类中的抽象方法的访问类型可以是public,protected和default,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
这一点有争议,网上查找资料说明
抽象类
JDK 1.8以前,默认访问权限为protected
JDK 1.8时,默认访问权限变为default
接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的
5.抽象类中可以包含静态方法,接口中不能包含静态方法
静态方法就是static修饰的方法,一个类中只有一个,这个类的所有对象都调用同一个方法
因为抽象类中可以有非抽象的方法,所以可以有静态方法
接口中不能有非抽象的方法,static和abstract不能共存
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
概念
7.一个类可以实现多个接口,但是只能继承一个抽象类
抽象类也是类
,一个类可以实现多个接口,但是只能继承一个类
参考文章: