抽象类用abstract class声明,不能实例化,用于定义子类必须遵循的结构和共通行为;含抽象方法(abstract修饰、无方法体)和具体方法,子类须实现全部抽象方法,否则仍为抽象类。

抽象类用 abstract class 关键字声明,不能被实例化,主要用来定义子类必须遵循的结构和共通行为。
抽象类的定义规则
定义抽象类需满足几个基本语法要求:
- 类名前加 abstract 修饰符,例如:
abstract class Animal { ... } - 可包含普通方法(有实现)、抽象方法(无实现,只有签名)和字段
- 抽象方法必须用 abstract 修饰,且不能有方法体(不写大括号),结尾以分号结束
- 抽象类可以有构造方法,供子类调用(通过
super()),但自身不能 new 实例
抽象方法与子类实现
抽象方法强制子类提供具体逻辑,是实现“模板设计”的核心机制:
- 子类继承抽象类,必须用 override(C#)或 @Override(Java)实现所有抽象方法,除非子类也声明为 abstract
- 例如:抽象类中定义
abstract void makeSound();,子类Dog就得写void makeSound() { System.out.println("Woof!"); } - 子类可选择重写普通方法,也可直接继承使用
抽象类 vs 接口的关键区别
两者都支持多态和契约约束,但定位不同:
- 抽象类体现“是什么”(is-a 关系),支持字段、构造器、部分实现;接口体现“能做什么”(can-do),默认只定义行为契约(Java 8+ 可含 default/static 方法)
- 一个类只能继承一个抽象类,但可实现多个接口
- 抽象类中的成员可设
protected或public,接口中方法默认 public,字段默认 public static final
典型使用场景
适合用于有共同状态和基础逻辑,但具体行为需由子类决定的模型:
- 图形绘制系统:
Shape抽象类含area()(抽象)和toString()(已实现) - 数据处理器:
Processor<t></t>定义parse()和validate()抽象方法,各子类处理 JSON、XML 等不同格式 - 游戏实体:父类
GameEntity封装坐标、生命值等字段和update()框架方法,子类实现render()细节










