抽象类
抽象类是特殊的类,只是不能被实例化,天生就是要被继承的;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们 抽象方法必须用abstract关键字进行修饰。
抽象类的特点
- 不能被直接实现,只能先被继承再间接实现。
- 子类必须实现父类的抽象方法,除非子类也是抽象类。
- 其中的方法只能是被 public(默认)、protected 声明。
- 含有抽象方法一定是抽象类,但抽象类不一定含有抽象方法。
接口
接口其实也是一种抽象,比抽象更抽象,其中的方法被隐式的指定为了 abstract 就有体现,接口是对行为的抽象。在 JDK1.8 前都是不能有任何具体方法实现,所以其中是抽象方法。
接口的特点
- 支持多继承,一个接口可以 extends 多个接口,间接解决了 Java 单继承的问题。
- 一个类可以实现多个接口。
- 接口中的变量被隐式的指定为了public static final,方法隐式指定为public abstract(JDK1.8之前)。
- JDK1.8 之前不能有静态方法和具体实现的方法,但是 JDK1.8 开始就可以有静态方法和具体的实现方法(默认方法 default)。
- JDK1.8 后 static 可以单独修饰一个方法,也就是接口静态方法,接口名.方法名() 调用。
业务场景下的选择
- 如果使用接口的业务下,需要不断改变基本功能,那么就需要改变所有实现了该接口的类,但如果使用抽象类,可以达到解耦目的,因为 抽象类定义你是什么,接口定义你能做什么。
- 如果想实现多继承,那么必须使用接口。由于Java不支持多继承,即一个类 只能有一个超(父)类。但是,可以实现多个接口,因此可以使用接口来解决它。
版本变化
Java语言的版本升级过程中,接口和抽象类都有了一些变化。以下是主要的一些变化:
-
默认方法(default method):从Java 8开始,接口可以定义默认方法,也称为扩展方法或带有默认实现的方法。这些方法具有默认的实现代码,可以被接口的所有实现类共享。默认方法可以通过在接口中使用default关键字来定义,实现类可以选择性地重写默认方法。
-
静态方法(static method):从Java 8开始,接口可以定义静态方法。这些方法与类的静态方法类似,不依赖于接口的实现类,可以直接通过接口名调用。
-
私有方法(private method):从Java 9开始,接口可以定义私有方法。这些方法只能在接口内部调用,无法被实现类或其他类调用。
-
非抽象方法(non-abstract method):从Java 9开始,抽象类可以定义非抽象方法。这些方法可以有具体的实现代码,不再需要在子类中实现。
持续更新中…….. 敬请期待