抽象类和接口的区别

Java是单继承和多实现

参数 抽象类 接口
声明 用abstract关键字声明 用interface关键字声明
实现 子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中所有声明方法的实现 子类使用implements关键字来实现接口,它需要提供接口中所有声明方法的实现
构造器 可以有构造器 不能有构造器
访问修饰符 抽象类中的方法可以任意访问修饰符 接口方法默认修饰符是public,并且不允许定义为private或者protected
多继承 一个类最多只能继承一个抽象类 一个类可以实现多个接口
字段声明 可以是任意的 默认都是static和final的
实例化 不能 不能

都位于继承的顶端,用于被其他实现或继承

都包含抽象方法,其子类都必须覆写这些抽象方法

用来捕捉子类的通用特性

是抽象方法的集合

设计层面 是对类的抽象,是一种模板设计 是行为的抽象,是一种行为的规范
表示含义 这个对象是什么(is a) 这个对象能做什么(has)
侧重于描述事务 侧重于定义功能
属性 有普通属性,有静态属性(类属性) 没有普通属性,只有静态属性,只能用public final static修饰
方法 有普通方法,可以定义静态方法,也可以没有抽象方法 没有方法体,默认使用public abstract修饰,不能定义静态方法

备注:Java8接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。

现在,可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

接口和抽象类选择上,遵循这样的原则:

  • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
  • 选择抽象类:需要定义子类的行为,又要为子类提供通用的功能

你可能感兴趣的:(Java基础面试题,java,c#,c++)