前言
抽象类和接口在面试中经常被同时问到,两者有一定的相似点与不同点,很容易发生混淆。我本人也是记住了忘,忘了复习一下,过段时间又忘了。所以说今天写下这篇文章总结一下两者的特点与区别,顺便巩固一下自己的Java知识体系,也方便以后复习。我会尽可能全面的阐述两者各自的特点,如有遗漏,敬请补充。
抽象类
- 抽象类属于类,由
class
关键字修饰,单继承,同时会由abstract
关键字修饰; - 含有抽象方法的类是抽象类,但是抽象类可以没有抽象方法;
- 抽象类可以拥有构造函数,但是无法实例化,即无法通过new创建对象。但是仍然可以定义抽象类的变量,使其指向子类实现,并且实现多态;
- 抽象类可以拥有非抽象方法的具体实现;而抽象类中的抽象方法只有方法体,没有实现;
- 子类继承抽象类父类,则必须重写其全部的抽象方法,否则该子类也只能声明为抽象类,无法实例化;
接口
- 接口由
interface
关键字修饰,多实现; - 接口既可以被接口继承,使用
extends
关键字(和类继承类一样);也可以被类继承,使用implemets
关键字; - 接口中的方法全部都是抽象方法,且必须全部被继承该接口的子类所实现;
- 接口是公开的,没有私有的方法或变量,即不会出现
private
关键字; - 接口中的成员变量默认由
public static final
修饰,且必须赋初值;所有抽象方法都由public
和abstract
修饰;
总结
"接口"就是比"抽象类"更加"抽象"的"抽象类",抽象类中还能有非抽象方法的具体实现,而接口里面全部都是抽象方法。抽象类和接口都无法实例化,都是由其子类实现其内部的抽象方法,两者都是"抽象"的表现,抽象方法声明好,让其子类对该方法实现相应的功能就好啦。
而现在常说的"面向接口编程",也就是在面向对象的思想里,让接口定义一套规则,其子类只需考虑具体实现就好了。