笔试面试都爱问的一个问题,接口与抽象类的相同点、不同点以及之间的继承。
1.接口与抽象类的一些特性
接口:
(1)接口中所有方法为抽象方法;
(2)接口所有成员变量为static final类型;
(3)接口所有成员、方法为public。
抽象类:
(1)只要包含一个抽象方法的类即为抽象类;
(2)抽象方法不能有方法体;
(3)抽象类不能实例化;
(4)子类继承抽象类时必须为抽象类的抽象方法提供实现,否则子类也要声明为抽象类。
2.接口与抽象类的相同点
(1)接口和抽象类均不能实例化;
(2)接口实现类或抽象类的子类都要实现了接口的方法或抽象类抽象方法后才能被实例化。
3.接口与抽象类的不同点
(1)接口只有定义,不能包含实现;抽象类可以有定义也可以有实现,即抽象类中可以包含方法的实现;
(2)接口使用implements,抽象类使用extends;
(3)接口强调has-a关系,即包含关系;抽象类强调is-a关系,即所属关系;
(4)接口的所有变量默认为public static final,即只能有静态不能被修改的成员变量,且必须初始化;抽象类中可以有数据成员变量,默认为default;
(5)接口的所有方法默认修饰符public abstract,且不能包含方法的实现;抽象类中即可以有抽象方法,也可以有非抽象方法,抽象方法不能用private、static等修饰符修饰,且不带方法体;
(6)接口用于功能的实现;抽象类用于公共类,不适用于代码修改。
4.接口与抽象类的继承关系
接口:
(1)接口能够继承接口,并且能够继承多个接口;
(2)接口不能继承抽象类或非抽象类。
非抽象类:
(1)非抽象普通类只能继承一个类,但可以实现多个接口,并且需提供接口方法的实现;
(2)非抽象普通类可继承一个抽象类,并且需要对抽象类中的抽象方法提供实现。
抽象类:
(1)抽象类可以实现多个接口,并且可以不用提供接口方法的实现;
(2)抽象类可以继承抽象类,并且可以不用对父抽象类的抽象方法提供实现;
(3)抽象类可以继承非抽象普通类,并且可以重写父类方法。