子类继承抽象类时,若为抽象类可不重写父类抽象方法;若为具体类则必须实现所有未实现的抽象方法,包括继承链中各层的抽象方法,否则编译报错。

子类继承抽象类时,如果子类本身也是抽象类,可以不重写父类的抽象方法;如果子类是普通(具体)类,则必须实现所有未被实现的抽象方法——包括直接定义在父抽象类中的,以及从更上层继承来的。
子类是抽象类:可选择性重写
抽象子类不必实现父类的抽象方法,它可以继续将这些方法“传递下去”。也可以只重写部分方法,把剩下的留给更下层的具体子类。
- 重写时用 public 或 protected 修饰符(不能比父类更严格)
- 方法签名(名称、参数列表、返回类型)必须与父类完全一致
- 可以加 @Override 注解,增强可读性和编译检查
子类是具体类:必须全部实现
一旦子类去掉 abstract 关键字,它就成为可实例化的类,JVM 要求所有继承来的抽象方法都已有具体实现。
- 若遗漏任一抽象方法,编译直接报错:“must either be declared abstract or implement abstract method…”
- 实现时不能抛出比父类声明更宽泛的异常(遵循异常协变规则)
- 返回类型可以是父类声明类型的子类型(支持协变返回类型)
多层继承中的抽象方法传递
抽象方法会沿着继承链向下传递,直到被某个具体类实现。中间的抽象类可以复写(重写)、新增抽象方法,或提供默认实现(通过普通方法或 default 方法,但注意:default 是接口特性,抽象类中需用普通方法模拟)。
立即学习“Java免费学习笔记(深入)”;
- 例如:A(抽象)→ B(抽象)→ C(具体),C 必须实现 A 和 B 中所有未实现的抽象方法
- B 可以重写 A 的抽象方法并仍保持 abstract,此时该方法对 C 来说仍是抽象的
- B 也可以用 final 修饰重写后的方法,阻止 C 再覆盖
常见写法示例
假设父抽象类:
abstract class Animal {abstract void makeSound();
abstract int getLegs();
}
子抽象类可只实现部分:
abstract class Mammal extends Animal {@Override
int getLegs() { return 4; } // 实现了 getLegs
// makeSound 未实现,仍由子类承担
}
具体子类必须补全:
class Dog extends Mammal {@Override
void makeSound() { System.out.println("Woof!"); }
// getLegs 已继承实现,无需再写
}


















