抽象类的派生类若也声明为抽象类,可不实现父类所有抽象方法,仅需聚焦自身语义契约,未重写方法继续向下传递约束;如shape→twodimensionalshape→circle分层中,中间类可只重写calcarea()而保留draw(),直至具体类才全部实现。

当一个抽象类的派生类本身也声明为抽象类时,它不必实现父类的所有抽象方法——这是 Java 允许的合法递延设计。这种结构常见于分层建模中,比如“图形→二维图形→可填充图形”这样的多级抽象,每一层只聚焦自身语义范围内的契约,把具体实现留给更末端的子类。
派生抽象类可以不重写父类抽象方法
只要子类也用 abstract 修饰,它就可以选择性地重写部分抽象方法,甚至一个都不重写。未重写的方法会原样继承,并继续向下游传递约束。
- 父类定义了
draw()和calcArea()两个抽象方法 - 中间抽象子类
TwoDimensionalShape只重写了calcArea(),保留draw()不实现 - 那么
TwoDimensionalShape仍是抽象类,不能实例化;它的子类(如Circle)必须实现draw()才能成为具体类
递延重写的典型分层结构示例
这种模式适合表达“能力逐步具象化”的业务模型:
-
Shape(顶层抽象):声明通用行为draw()、getArea() -
DrawableShape(中间抽象):专注绘制逻辑,重写draw(),但把面积计算仍留空 -
FilledShape(再下一层抽象):专注填充规则,新增fill()抽象方法,同时继承未实现的getArea() -
Rectangle(最终具体类):同时实现draw()、getArea()、fill(),才能被 new 出来
注意构造与访问权限的连贯性
每层抽象类仍需维护合理的封装和初始化逻辑:
- 所有抽象类的构造方法建议设为 protected,避免被外部直接调用
- 若某层抽象类重写了父类的普通方法(非抽象),该实现会向下继承;若想让子类“必须重新考虑”,可将其改为抽象方法并提升约束
- 使用
super()在子类构造中显式调用父类构造,确保逐层初始化共享字段(如color、visible等跨层级属性)
何时该停止递延?关键看是否具备实例化意义
判断某一层是否该结束抽象,核心标准是:这个类能否代表一个**完整、可识别、有明确行为边界**的实体。
- “动物”是抽象的 → “哺乳动物”仍抽象 → “猫”就可以具体化
- “支付方式”抽象 → “在线支付”仍抽象 → “微信支付”就应提供完整实现
- 一旦某个子类不再需要强制他人继续扩展,就不该再声明为 abstract
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











