抽象类(abstract class)和接口(interface)有什么区别?

  1. 接口的方法默认是public,接口中的方法不能有实现(Java 8开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
  2. 接口中除了静态和final变量,不能有其他变量,而抽象类中则不一定。
  1. 一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口。
  2. 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法是为了被重写所以不能使用private关键字修饰)。
  3. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

补充:

  1. 在JDK 8中,接口也可以定义静态方法,可以直接使用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了相同的默认方法,则必须重写,否则会报错。
  2. JDK 9引入了接口中可以定义私有方法。

总结一下JDK 7~9中Java中接口的变化:

  1. 在JDK 7或更早版本中,接口里只能有常量变量和抽象方法。这些接口方法必须由实现接口的类来实现。
  2. JDK 8引入了接口可以有默认方法和静态方法的功能。
  3. JDK 9在接口中引入了私有方法和私有静态方法。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题