应选抽象类当且仅当该类逻辑不完整不可实例化、需强制子类实现特定方法、且存在共用状态或基础功能;否则选普通类或接口。

选抽象类还是普通类,关键看这个类在系统里“能不能独立干活”以及“要不要管住子类”。不是语法难,而是设计意图容易模糊。
看这个类是否允许被 new 出来
如果逻辑上它本身不完整、不能单独存在,比如“图形”“车辆”“支付方式”,只是个概念,那就该用抽象类。Java 会强制你不能 new 它,避免误用。
- 抽象类用 abstract class 声明,编译器禁止直接实例化
- 普通类必须能 new,否则就是设计错误——要么补全逻辑,要么改成抽象类
- 例子:Animal 抽象类不能 new;Dog 继承它后才能 new new Dog("旺财")
看是否需要强制子类实现统一行为
当多个子类都必须提供某几个核心操作(比如 start()、validate()、render()),但各自实现完全不同,抽象方法就是最直接的约束手段。
- 在抽象类中声明 public abstract void render();,子类不重写就编译不过
- 普通类只能提供默认实现,子类可覆盖也可忽略,缺乏契约力
- 接口也能约束,但抽象类还能同时给共用字段、protected 工具方法、构造逻辑
看是否有共用状态或基础功能要下放
抽象类天然适合做“模板基类”:有构造器初始化共享资源,有 protected 方法供子类调用,有字段存公共配置。
- 比如 BaseDao 封装 getConnection、closeConnection、logSQL,子类只专注 SQL 和映射
- 普通类虽可复用,但无法要求子类必须继承它;而抽象类一定义,就明确了“is-a”关系和扩展路径
- 工具类(全是 static 方法)不用抽象——它压根不参与继承体系,普通类更干净
别为了抽象而抽象
抽象类不是高级装饰,它解决三个实际问题:不能实例化 + 要约束子类 + 有共用代码。三者缺一,就该考虑普通类甚至接口。
- 只有共用代码、无约束需求?普通类继承更轻量
- 纯行为契约、无状态、多实现?优先接口
- 既要有字段又要强制实现还要复用逻辑?抽象类是平衡点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











