接口和抽象类的区别?
-
设计角度
1、接口是自上而下的,简单来说就是接口的设计规范是先有接口,后有类实现。表示关系:has a
2、抽象类是自下而上的,简单来说就是抽象类的设计规范是先有子类方法的共有,后有父类抽取的抽象类。表示关系:is a
-
使用角度
1、在抽象类中可以有构造方法,非抽象的普通方法,静态方法以及静态代码块,并且可以提供方法的实现,而接口中只能有public修饰的抽象方法,在JDK1.8之后可以有default修饰方法以提供方法的实现。
2、抽象类的成员变量可以是各种类型的,但接口的成员变量只可以是final static public类型的。
3、都不可以被实例化,接口是为了解决类不能多继承的问题,抽象类是用来继承的,接口是用来实现的。
4、接口中不能含有构造器,静态代码块,静态方法,而抽象类中可以有构造器,静态代码块和静态方法。
-
访问速度
抽象类的访问速度比接口要快,因为接口要在勒种寻找具体的实现
-
拓展性
要在抽象类中添加方法可以直接提供默认实现,但是在接口中添加方法却要改变接口的实现类,JDK1.8之后可以提供方法的实现子类不需要实现
-
为什么接口的成员变量需要用static final 修饰?
static:为了避免子类使用时产生的歧义。(子类可能实现多个接口,多个接口的变量可能一样)
final:既然必须是static修饰的那么所有的子类共享,而接口是一种抽象,所以为了避免一个子类修改影响到了其他子类,因此就不应该允许子类修改,也就必须定义为final了