Java 抽象类与接口
抽象是面向对象编程的四大支柱之一。它旨在隐藏复杂的实现细节,只向用户暴露必要的功能。在 Java 中,抽象主要通过抽象类 (Abstract Class) 和接口 (Interface) 这两种机制来实现。
抽象类 (Abstract Class)
抽象类是一个不能被实例化的类,它充当其他类的父类(基类)。它用于定义一种类型的通用模板,其中可以包含一些已经实现的具体方法和一些必须由子类实现的抽象方法。
- 使用
abstract关键字来声明一个抽象类。 - 抽象类可以包含实例变量、构造方法、具体方法(有方法体)和抽象方法。
- 抽象方法:只有方法签名,没有方法体,使用
abstract关键字声明。任何继承了抽象类的子类,都必须实现其所有的抽象方法,除非该子类自己也是一个抽象类。
接口 (Interface)
接口是一种完全抽象的引用类型,它定义了一组方法(行为契约),任何实现了该接口的类都必须提供这些方法的具体实现。接口是实现多重继承的一种方式。
- 使用
interface关键字来声明一个接口。 - 接口中的所有方法默认都是
public abstract的(Java 8 之前)。 - 接口中的所有变量默认都是
public static final的(即常量)。 - 一个类使用
implements关键字来实现一个或多个接口。
Java 8+ 接口的增强
从 Java 8 开始,接口可以包含 default 方法和 static 方法,这为接口增加了更多的灵活性。
- 默认方法 (
defaultmethod): 允许在接口中提供一个方法的默认实现。实现该接口的类可以不重写此方法,直接使用默认版本。 - 静态方法 (
staticmethod): 属于接口本身,只能通过接口名调用。
抽象类 vs. 接口
何时使用?
- 使用抽象类: 当你想创建一个基类,它包含了一些子类共享的通用代码和状态时。当类之间存在明显的层级和“is-a”关系时(例如
Dogis anAnimal)。 - 使用接口: 当你想定义一个角色或能力,而这个能力可以被不同层级的类所拥有时。当你希望一个类能拥有多种不相关的行为时(例如一个
Bird类可以同时实现Flyable和Singable接口)。