抽象类

抽象类是特殊的类,只是不能被实例化,天生就是要被继承的;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们 抽象方法必须用abstract关键字进行修饰。

抽象类的特点

  1. 不能被直接实现,只能先被继承再间接实现。
  2. 子类必须实现父类的抽象方法,除非子类也是抽象类。
  3. 其中的方法只能是被 public(默认)、protected 声明。
  4. 含有抽象方法一定是抽象类,但抽象类不一定含有抽象方法。

接口

接口其实也是一种抽象,比抽象更抽象,其中的方法被隐式的指定为了 abstract 就有体现,接口是对行为的抽象。在 JDK1.8 前都是不能有任何具体方法实现,所以其中是抽象方法。

接口的特点

  1. 支持多继承,一个接口可以 extends 多个接口,间接解决了 Java 单继承的问题。
  2. 一个类可以实现多个接口。
  3. 接口中的变量被隐式的指定为了public static final,方法隐式指定为public abstract(JDK1.8之前)。
  4. JDK1.8 之前不能有静态方法和具体实现的方法,但是 JDK1.8 开始就可以有静态方法和具体的实现方法(默认方法 default)。
  5. JDK1.8 后 static 可以单独修饰一个方法,也就是接口静态方法,接口名.方法名() 调用。

业务场景下的选择

  • 如果使用接口的业务下,需要不断改变基本功能,那么就需要改变所有实现了该接口的类,但如果使用抽象类,可以达到解耦目的,因为 抽象类定义你是什么,接口定义你能做什么
  • 如果想实现多继承,那么必须使用接口。由于Java不支持多继承,即一个类 只能有一个超(父)类。但是,可以实现多个接口,因此可以使用接口来解决它。

版本变化

Java语言的版本升级过程中,接口和抽象类都有了一些变化。以下是主要的一些变化:

  1. 默认方法(default method):从Java 8开始,接口可以定义默认方法,也称为扩展方法或带有默认实现的方法。这些方法具有默认的实现代码,可以被接口的所有实现类共享。默认方法可以通过在接口中使用default关键字来定义,实现类可以选择性地重写默认方法。

  2. 静态方法(static method):从Java 8开始,接口可以定义静态方法。这些方法与类的静态方法类似,不依赖于接口的实现类,可以直接通过接口名调用。

  3. 私有方法(private method):从Java 9开始,接口可以定义私有方法。这些方法只能在接口内部调用,无法被实现类或其他类调用。

  4. 非抽象方法(non-abstract method):从Java 9开始,抽象类可以定义非抽象方法。这些方法可以有具体的实现代码,不再需要在子类中实现。

持续更新中…….. 敬请期待