抽象类用abstract声明,定契约留实现,含抽象/具体方法及构造器,子类必须实现全部抽象方法或自身声明为abstract,适用于is-a关系与共性逻辑并存场景。

Java 中用 abstract 关键字定义抽象类,核心是“定契约、留实现”——规定子类必须提供哪些行为,但不写具体怎么做。它不是为了直接创建对象,而是为一组相关子类提供统一结构和复用基础。
抽象类怎么声明
用 abstract class 类名 声明,不能被 new 实例化:
- 哪怕类里一个抽象方法都没有,只要加了 abstract,它就是抽象类
- 如果类中包含至少一个抽象方法,那这个类必须声明为 abstract,否则编译报错
- 抽象类可以有:普通字段、构造方法、具体方法(带实现)、抽象方法(无实现)
- 构造方法虽不能直接调用,但子类通过 super() 可以调用它来初始化共用状态
抽象方法怎么写
只声明签名,不写实现,语法上以分号结尾:
- 格式如:public abstract void run();
- 不能是 private(子类不可见)、static(不属于实例)、final(禁止重写)
- 不能有方法体,写 {} 或 return; 都会编译失败
- 访问修饰符默认是 public 或 protected,不能写 private abstract
子类怎么继承和实现
子类用 extends 继承抽象类,必须处理所有抽象方法:
- 如果子类是具体类(非 abstract),就必须重写父类中每一个抽象方法
- 如果子类暂时不想实现全部,可以把自己也声明为 abstract,把契约继续往下传
- 子类可直接使用父类的具体方法,无需重写,这是抽象类比接口更强的复用能力
- 多态常见写法:Animal a = new Dog(); —— 抽象类类型变量引用具体子类实例
什么时候该用抽象类
适合表达“is-a”关系,且存在共性逻辑与差异化实现并存的场景:
- 图形计算:Shape 定义 area()(抽象),Circle 和 Rectangle 各自实现
- 动物系统:Animal 定义 makeSound()(抽象)和 sleep()(具体),Dog/Cat 只需定制叫声
- 模板方法模式:抽象类封装流程骨架(如 makeDish()),把 prepare()、cook() 等步骤设为抽象,由子类填充细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











