Java抽象类可定义实例变量、构造方法、普通方法、静态方法和常量,用法与普通类完全一致;唯一限制是不能被new直接实例化,其设计本质是支持状态与行为复用的半成品模板。

Java 中抽象类可以像普通类一样定义字段(属性)、构造方法、普通方法,甚至静态方法和常量,唯一限制是不能被 new 直接实例化。它本质上仍是“类”,只是多了“不完整、需子类补全”的设计约束。
能包含哪些普通成员?
抽象类支持以下非抽象成分,且用法与普通类完全一致:
-
实例变量:如
protected String name;、private int age; -
构造方法:用于子类初始化时调用(通过
super()),即使抽象类不能自己 new,它的构造器仍会执行 - 普通(非 abstract)实例方法:有完整方法体,子类可直接继承、调用或重写
-
静态方法和静态字段:如
public static final String VERSION = "1.0"; - final 方法:可防止子类覆盖,与抽象方法共存无冲突
为什么允许这些?
抽象类的设计目标不是“空壳”,而是“半成品模板”:
- 用普通方法封装所有子类共用的逻辑(比如日志记录、参数校验、通用计算),避免重复代码
- 用字段保存共性状态(如动物的
name、图形的color) - 用构造器统一初始化流程(例如强制传入必要参数并赋值给父类字段)
- 抽象方法只负责定义“必须做什么”,普通成员负责实现“怎么做”或“共享什么”
一个典型例子
下面这个抽象类同时含字段、构造器、普通方法和抽象方法:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
JAVAabstract class Vehicle {<br> protected String brand;<br> protected int year;<br><br> // 构造器供子类调用<br> public Vehicle(String brand, int year) {<br> this.brand = brand;<br> this.year = year;<br> }<br><br> // 普通方法:所有子类都能直接用<br> public void start() {<br> System.out.println(brand + " is starting...");<br> }<br><br> // 抽象方法:子类必须自己实现<br> public abstract void drive();<br>}
子类如 Car 或 Bike 继承后,自动获得 brand 字段、start() 方法,并必须实现 drive() —— 这就是抽象类“契约+复用”的双重作用。

















