在Java的面向对象编程体系中,抽象类是一种特殊的类,它不能被直接实例化,主要用于作为其他类的父类,定义通用的属性和方法,同时约束子类必须实现特定的抽象方法。使用abstract关键字就可以完成抽象类的定义,这种设计既保留了代码复用的能力,又能通过抽象方法强制子类遵循统一的行为规范。

abstract关键字的基本用法
定义抽象类时,需要在class关键字前添加abstract修饰符,抽象类中可以包含抽象方法和具体实现的方法。抽象方法同样需要用abstract修饰,并且没有方法体,只有方法声明。
下面是一个基础的抽象类定义示例:
// 定义抽象类Animal
abstract class Animal {
// 具体实现的属性
protected String name;
// 具体实现的构造方法
public Animal(String name) {
this.name = name;
}
// 具体实现的普通方法
public void eat() {
System.out.println(name + "正在进食");
}
// 抽象方法,没有方法体,由子类实现
public abstract void makeSound();
}
抽象类的部分实现特性
抽象类的核心设计思想之一就是可以包含部分具体实现,这和接口只能定义抽象方法(Java8之前)有明显区别。父类可以把所有子类通用的逻辑写在具体方法里,子类只需要重写自己特有的抽象方法即可,大幅减少了重复代码的编写。
比如上面的Animal类,所有动物都有进食的行为,所以eat方法可以直接实现,而不同动物的叫声不同,所以makeSound定义为抽象方法,让子类各自实现。
子类继承抽象类的规则
子类继承抽象类时,必须实现父类中所有的抽象方法,除非子类本身也声明为抽象类。如果子类没有实现全部抽象方法,编译器会直接报错。
下面是继承Animal抽象类的子类示例:
// 继承抽象类Animal的子类Dog
class Dog extends Animal {
public Dog(String name) {
super(name);
}
// 必须实现父类的抽象方法makeSound
@Override
public void makeSound() {
System.out.println(name + "汪汪叫");
}
}
// 继承抽象类Animal的子类Cat
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + "喵喵叫");
}
}
抽象类的使用限制
抽象类有以下几个常见的使用限制,需要开发者注意:
- 抽象类不能直接通过new关键字实例化,比如
Animal animal = new Animal("动物")会编译报错 - 抽象方法不能是私有的,因为私有方法无法被子类重写,和抽象方法的设计目的冲突
- 抽象类可以有构造方法,这些构造方法会在子类实例化时被调用,用于初始化父类的属性
- 抽象类可以包含静态方法,静态方法可以直接通过抽象类名调用,不需要实例化
部分实现的设计思想价值
抽象类的部分实现设计,本质是模板方法模式的简化体现。父类定义了一套逻辑的框架,把固定不变的通用逻辑写成具体方法,把可变的、需要子类定制的逻辑定义为抽象方法,既保证了整体逻辑的一致性,又给子类留出了定制空间。
比如在开发支付模块时,可以定义一个抽象的支付基类,把支付前校验、支付后日志记录的通用逻辑写成具体方法,把不同支付方式(微信、支付宝、银行卡)的支付核心逻辑定义为抽象方法,不同支付子类只需要实现自己的支付逻辑即可,大幅降低了代码的耦合度。
抽象类与接口的对比
很多开发者会混淆抽象类和接口的用途,两者的核心区别如下:
| 对比维度 | 抽象类 | 接口 |
|---|---|---|
| 方法类型 | 可以包含抽象方法和具体实现方法 | Java8之后可以包含默认方法和静态方法,之前只能有抽象方法 |
| 属性类型 | 可以是任意访问修饰符的普通属性 | 默认是public static final的常量 |
| 继承规则 | 单继承,一个类只能继承一个抽象类 | 多实现,一个类可以实现多个接口 |
| 设计目的 | 代码复用,定义类的通用模板 | 定义行为规范,实现多态 |
实际使用示例
下面是一个完整的测试示例,展示抽象类的使用效果:
public class AbstractTest {
public static void main(String[] args) {
Animal dog = new Dog("小黄");
Animal cat = new Cat("小白");
dog.eat();
dog.makeSound();
cat.eat();
cat.makeSound();
}
}
运行上述代码,会输出如下结果:
小黄正在进食
小黄汪汪叫
小白正在进食
小白喵喵叫
可以看到,子类复用了父类的eat方法,同时实现了自己的makeSound方法,完美体现了抽象类的部分实现设计思想。
Javaabstract关键字抽象类部分实现修改时间:2026-06-14 14:18:32