抽象类中成员变量定义与普通类一致,支持任意访问修饰符(除abstract)、实例/静态变量及常量,子类按权限继承访问,构造器可初始化,静态变量共享,private变量需getter/setter间接访问。

在 Java 抽象类中定义和使用成员变量,和普通类几乎完全一样——抽象类可以声明任意访问权限的成员变量(private、protected、public 或包级私有),也能初始化、赋值、被子类继承或访问(取决于修饰符),唯一限制是不能用 abstract 修饰变量(因为变量本身不参与“抽象”行为)。
成员变量的定义方式
抽象类中的成员变量声明语法与普通类一致,支持实例变量和静态变量:
- 实例变量:每个子类实例都拥有独立副本,可被子类继承(若非
private) - 静态变量(
static):属于抽象类自身,所有子类共享同一份数据 - 常量(
public static final)常用于定义通用配置或标识,推荐大写命名
示例:
abstract class Animal {
protected String name; // 实例变量,子类可直接访问
private int age; // 实例变量,仅本类可用
public static final String CATEGORY = "Mammal"; // 常量,全局共享
protected static int count = 0; // 静态变量,记录创建总数
}
子类如何访问和使用这些变量
子类继承抽象类后,能按访问修饰符规则使用其成员变量:
立即学习“Java免费学习笔记(深入)”;
-
public和protected的实例变量:子类中可直接读写(如this.name = "Dog") -
private变量:子类无法直接访问,需通过抽象类提供的getter/setter方法间接操作 - 静态变量:可通过类名(
Animal.count)或子类名(Dog.count)访问,修改会影响所有子类
注意:抽象类的构造方法会在子类实例化时自动调用(哪怕没有显式 super()),因此适合在构造器中初始化成员变量。
常见误区提醒
容易混淆的几个点需要特别注意:
- 抽象类不能被实例化,但它的成员变量仍会随子类对象创建而分配内存(实例变量)或随类加载而初始化(静态变量)
- 不能用
abstract修饰变量——编译会报错;abstract只适用于方法和类 - 如果抽象类中定义了
final实例变量,必须在构造器或声明时初始化,否则编译失败 - 子类重写方法中可自由使用继承来的变量,但不能“重写”变量(只能隐藏:用同名变量遮蔽父类变量,不推荐)
实用建议
为保持清晰和可维护性,推荐以下做法:
- 优先将成员变量设为
protected或private,配合getter/setter提供受控访问 - 避免在抽象类中暴露过多
public字段,防止子类随意修改破坏封装 - 静态变量慎用,尤其可变静态状态,可能引发多线程或子类间意外耦合
- 常量统一用
public static final定义,并加 Javadoc 说明用途


















