一、抽象类
概念
抽象类是不能完全实现的类,它通常作为其他类的基类使用。抽象类可以包含抽象方法,这些方法只有声明没有实现。
语法
在Java中,使用abstract
关键字来定义抽象类和抽象方法。
特点
- 不能被直接实例化。
- 可以包含成员变量、方法、构造方法。
- 可以被继承。
- 包含抽象方法的类必须是抽象类。
- 抽象类中的抽象方法不能被
private
、static
或final
修饰。 - 子类必须实现抽象类的抽象方法,除非子类也是抽象类。
使用场景
- 当多个子类共享相同的方法,但实现可能不同。
- 当类的对象不适用时,如在设计一个类层级结构时。
二、接口
概念
接口是一种形式的契约,定义了实现类必须遵守的规则。它是一种特殊的抽象,可以定义方法和变量,但不能实现它们。
语法
使用interface
关键字定义接口。
特点
- 成员变量默认是
public static final
。 - 方法默认是
public abstract
。 - 可以包含默认方法(Java 8+)和静态方法。
- 不能被实例化。
- 不能包含构造方法。
- 一个类可以实现多个接口。
- 实现接口的类必须实现接口中的所有方法,除非类也是抽象的。
使用场景
- 当需要规定类必须遵守的契约时。
- 当两个或更多的类共享行为时,但不想建立类继承关系。
三、抽象类与接口的区别
-
结构组成:
- 抽象类可以包含字段、方法、构造方法等。
- 接口只能包含常量、抽象方法、默认方法和静态方法。
-
权限修饰符:
- 抽象类中的成员可以有多种访问修饰符。
- 接口中的成员默认是
public
。
-
继承与实现:
- 类通过
extends
关键字继承抽象类。 - 类通过
implements
关键字实现接口。
- 类通过
-
多重继承:
- 类只能继承一个抽象类。
- 类可以实现多个接口。
-
实例化:
- 抽象类不能被直接实例化,但可以有构造方法供子类调用。
- 接口不能被实例化。
-
实现细节:
- 抽象类可以包含实现细节。
- 接口在Java 8之前不能包含实现细节,但可以包含默认方法和静态方法。