接口与抽象类

  • 什么是接口
  • 什么是抽象类
  • 接口与抽象类的相同点
  • 接口与抽象类的不同点
  • 常见面试题

什么是接口

Java 中的一种特殊数据类型,可以被看作是一个纯粹的规范或者协议,它声明了一组方法的签名,但不包含任何实现代码

简单来说:负责声明方法,但不实现方法

特点:interface关键字修饰,不能实例化

作用:分离接口与实现,使得代码修改时与接口本身无关

实现要求: 1. 类使用 implements 关键字实现接口,实现(重写)接口中所有方法

​ 2. 实现方法时:方法名称,参数列表(甚至参数顺序),返回类型都要与接口一致

​ 3. 实现类重写方法时必须使用 public 访问修饰符(重写的要求就是访问修饰符要和父类访问一致或更加宽松,接口设计初衷就是为了给外部调用,所以接口方法默认 public , 实现类也就需要是public)

​ 4. 实现类不能完全实现接口时,实现类应该声明为抽象类

​ 5. 一个实现类可以实现多个接口,中间使用逗号隔开

什么是抽象类

Java 中一种实现抽象的机制,它是一种不能直接实例化的类, 只能作为基类存在,其目的是为了让子类继承并实现其中定义的抽象方法

简单来说:提取相关子类的公共行为

特点:可以有成员变量和实现方法给子类用,有 abstracrt 关键字修饰,不能实例化

作用:提高代码复用

实现要求: 1. 一个子类必须实现其继承抽象类的全部抽象方法,否则该子类也必须被定义为抽象类

​ 2. 抽象类中实例变量和方法可以被子类直接调用

​ 3. 抽象类可以有构造方法,但不能直接实例化

接口与抽象类的相同点

  1. 都不能用于实例化对象,只能用作规范或者模板
  2. 都可以被实现类或子类继承或实现

接口与抽象类的不同点

  1. 实现方式不同:接口只能定义方法签名,不能包含实现,而抽象类可以包含具体的方法实现
  2. 关系不同:实现类可以同时实现多个接口,但只能够继承一个抽象类
  3. 成员变量不同:接口只能包含常量,不能包含成员变量;抽象类可以包含成员变量
  4. 构造器不同:接口没有构造器,而抽象类有构造器

常见面试题

  1. Java抽象类可以添加final修饰符吗?

回答:不可以,被声明为final的类会被阻止继承,而抽象类的作用就是用于继承。

  1. 抽象类是否有构造函数,可以创建实例吗?

回答:抽象类可以有构造函数,但是不能创建实例,因为抽象类之定义了部分方法和属性,仍然存在方法需要子类去实现,所以抽象类是不完整的类,自然无法实例化

  1. Java抽象类的构造函数有什么作用?

回答:提供给子类进行初始化操作,当创建子类对象时,会优先调用父类构造函数(如果父类没有无参构造函数,需要子类手动调用父类有参构造函数并传递对应参数),再调用子类构造函数,当然,抽象类也会有默认的无参构造函数

  1. 什么时候使用接口比抽象类更好

回答:当需要考虑到多继承时,例如目标类已经继承了其他类,而java并不支持继承多个类,但是允许实现多个接口,可以通过实现接口新增方法;合适的松耦合使得代码实现和接口分离;

  1. 什么时候使用抽象类比接口更好

回答:抽象类能提供默认的一些实现,子类继承时可以少一些公用代码,提高了代码的可维护性;构造函数的存在可以让对象实例初始化时执行操作;