在 Java 面向对象编程 中,抽象类(abstract class )是一种不能直接实例化的类,用于定义一组具有共同特征的类的基本结构。它既可以包含抽象方法 (无方法体,需子类实现),也可以包含具体方法(有方法体,可直接复用)。
核心特性
-
使用 abstract 关键字修饰类或方法。
-
抽象类可以有成员变量 、构造方法 和普通方法。
-
若类中存在抽象方法,则该类必须声明为抽象类。
-
子类必须实现所有抽象方法,否则也必须声明为抽象类。
示例代码
java
// 抽象类定义
public abstract class Employee {
private String name;
public Employee(String name) { this.name = name; }
public String getName() { return name; }
// 抽象方法
public abstract double computePay();
// 普通方法
public void mailCheck() {
System.out.println("Mailing a check to " + name);
}
}
// 子类实现抽象方法
public class Salary extends Employee {
private double salary;
public Salary(String name, double salary) {
super(name);
this.salary = salary;
}
@Override
public double computePay() {
return salary / 52;
}
}
在 main 方法中:
java
public static void main(String[] args) {
Employee e = new Salary("John", 5200);
e.mailCheck();
System.out.println("Weekly Pay: " + e.computePay());
}
适用场景
-
代码复用:在抽象类中定义通用方法(如日志、验证逻辑),子类直接继承使用。
-
统一接口:定义一组必须由子类实现的抽象方法,确保行为一致性。
-
共享状态:抽象类可维护成员变量和构造逻辑,适合需要共享初始化的场景。
与接口的区别
-
抽象类可包含状态(成员变量)[&和构造方法&],接口主要定义行为契约。
-
一个类只能继承一个抽象类,但可实现多个接口。
-
接口更适合多继承 和解耦协议 ,抽象类更适合代码复用与状态共享。
注意事项
-
抽象类不能用 new 实例化。
-
设计时应确保抽象类有明确的继承价值,否则可直接使用接口。
-
在 Java 8+ 中,接口也可有默认方法,但抽象类依然在需要状态和构造的场景中更优。