抽象类可包含构造方法和普通成员变量,构造器供子类调用以初始化父类字段,成员变量依修饰符决定继承访问权限,二者共同支撑子类状态与行为复用。

Java 抽象类完全可以包含构造方法和普通成员变量——这不是“例外”,而是设计本意。抽象类本质仍是类,只是不能直接 new 出实例;它的构造器供子类调用,成员变量则构成子类可继承的共享状态基础。
构造方法怎么写、怎么用
抽象类的构造方法语法和普通类完全一致,可以有参数、可以重载、可以调用 super() 或 this()。它不会被直接执行,只在子类创建对象时,由子类构造器显式或隐式调用(如通过 super(...))。
- 必须存在(哪怕空实现),否则子类无法初始化父类字段
- 常用于初始化 protected 或 package-private 成员变量
- 不能是 private(否则子类无法访问),通常用 public 或 protected
- 子类构造器第一行默认调用 super();若父类无无参构造器,子类必须显式调用带参 super(...)
普通成员变量怎么声明和继承
抽象类里的字段和普通类一样,支持 private、protected、public、static final 等修饰符。能否被子类访问,取决于修饰符和包关系。
- 推荐用 protected:既避免外部直接访问,又允许子类直接使用(无需 getter/setter)
- static final 变量(如常量)可直接通过类名调用,例如 Vehicle.TYPE
- private 字段也能被继承,但子类需通过父类提供的 public/protected 方法间接访问
- 子类构造器中可通过 super(值) 将参数传给父类构造器,完成字段初始化
一个典型组合示例
下面这个抽象类同时体现构造器与成员变量的协作:
abstract class Product {protected String name;
protected double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public void showInfo() {
System.out.println(name + " - ¥" + price);
}
public abstract void applyDiscount();
}
子类如 Book extends Product 在构造时必须调用 super(name, price),从而确保父类字段正确初始化;之后可直接使用 name 和 price,也能直接调用 showInfo()。
容易忽略的关键点
- 抽象类可以没有抽象方法,但只要有抽象方法,就必须声明为 abstract 类
- 构造器不参与多态,也不被继承,但它是子类对象初始化过程中不可或缺的一环
- 成员变量不是“占位符”,它们承载真实数据,是子类行为复用和状态统一的重要支撑
- 别把“不能 new”误解为“结构受限”——抽象类的语法自由度几乎等同于普通类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











