Java中的抽象类和接口
抽象类
抽象类(Abstract Class)是Java中一种特殊的类,主要用于继承而非实例化。它通过提取多个相关类的共性特征,为子类提供基础设计模板。抽象类定义了子类必须遵循的方法框架,而具体实现则由各个子类自行完成。
抽象类的主要特点包括:
- 使用
abstract
关键字修饰 - 可以包含抽象方法(没有方法体的方法)和具体实现的方法
- 可以包含成员变量、构造方法、普通方法等
- 子类继承抽象类后,必须实现所有抽象方法(除非子类也是抽象类)
示例:
abstract class Animal {private String name;public Animal(String name) {this.name = name;}// 抽象方法public abstract void makeSound();// 具体方法public void eat() {System.out.println(name + " is eating.");}
}
抽象类适用于需要定义一些共同行为但又不完全确定具体实现的场景,比如图形类中的计算面积方法,不同图形有不同的计算方式。
接口
接口(Interface)作为一种规范标准,定义了类的行为准则,它是方法特征的集合但不包含具体实现。从实现者的角度来看,接口明确规定了需要对外提供的服务能力。
主要特性如下:
- 采用
interface
关键字进行定义 - Java 8起支持包含默认方法和静态方法
- 方法默认且仅限为public abstract(可省略修饰符)
- 字段默认且仅限为public static final
- 类使用
implements
关键字实现接口 - 所有方法均为抽象方法,支持多重接口实现
实现要点:
- 实现接口的类必须重写所有抽象方法
- 接口间为继承关系,类与接口为实现关系
- 作为继承机制的补充,允许同时实现多个接口
示例:
interface Vehicle {void start(); // 抽象方法default void stop() { // Java 8默认方法System.out.println("Vehicle stopped");}static void honk() { // Java 8静态方法System.out.println("Honk honk!");}
}
接口适用于定义行为契约,比如比较能力(Comparable)、克隆能力(Cloneable)等。Java中一个类可以实现多个接口。
抽象类和接口的对比
特性 | 抽象类 | 接口 |
---|---|---|
关键字 | abstract class | interface |
继承/实现方式 | 通过extends继承 | 通过implements实现 |
方法 | 可以有抽象方法和具体方法 | Java 8前只能有抽象方法,之后可以有默认方法和静态方法 |
变量 | 可以有各种类型的成员变量 | 只能有public static final的静态常量 |
构造方法 | 可以有 | 不能有 |
多重继承 | 不支持(一个类只能继承一个抽象类) | 支持(一个类可以实现多个接口,弥补Java单继承的不足) |
设计目的 | 代码复用/部分实现、模版设计模式 | 定义行为契约/规范、提供能力/服务 |
访问修饰符 | 可以有各种访问控制 | 默认public(不能使用其他修饰符) |
使用场景选择:
- 当需要定义一些共同属性和部分实现时,使用抽象类
- 当只需要定义行为规范时,使用接口
- 从Java 8开始,接口和抽象类的界限变得模糊,可以根据具体情况选择
注意:在Java 9之后,接口还可以包含私有方法,进一步增强了接口的能力。