Java规范子类扩展行为的核心是抽象类、访问控制与设计约定协同:抽象方法强制实现,protected/final限定可扩展性,super复用父逻辑,Liskov原则保障语义一致性。

Java 中规范子类的扩展行为,核心不是靠语法强制,而是通过抽象类、访问控制和设计约定协同实现。重点在于让子类“知道该做什么”“不能绕开什么”“如何安全增强”,而不是放任自由覆盖。
用抽象类定义必须实现的行为
当父类无法提供具体逻辑,但又要求所有子类统一具备某项能力时,应声明为抽象方法。子类继承后必须用 @Override 实现,否则编译不通过。
- 抽象类本身不能被实例化,天然充当模板角色;普通类继承它,就自动接受了契约约束
- 例如:Shape 类定义 getArea() 为抽象方法,Circle 和 Rectangle 就必须各自给出面积计算逻辑
- 可在抽象类中混用具体方法(如通用校验、日志记录),形成“骨架+钩子”的结构
用 protected + final 组合控制可扩展边界
父类成员的访问修饰符直接影响子类能做什么:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- protected 字段/方法:允许子类直接访问或重写,是复用与定制的基础通道
- private 字段:子类不可见,只能通过父类提供的 public/protected 方法间接操作,保障封装性
- final 方法:禁止子类重写,确保关键逻辑不被破坏(如金融系统中的金额校验流程)
- final 类:彻底禁止继承,适用于工具类或高度稳定的实现(如 String)
用 super 显式复用父类逻辑,避免重复造轮子
子类重写方法时,若需保留父类原有行为并在此基础上增强,必须主动调用 super.xxx()。这不是语法强制,但属于关键规范:
立即学习“Java免费学习笔记(深入)”;
- 比如重写 save() 方法,先执行 super.save() 完成基础持久化,再追加审计日志
- 构造器中 super(...) 必须放在第一行,确保父类状态正确初始化,这是编译器强制的规范
- 不调用 super 可能导致字段未初始化、资源未分配,引发运行时异常
配合 Liskov 替换原则做语义约束
规范不止在代码层面,更在行为契约上:任何子类对象都应能无缝替换父类对象,且不改变程序正确性。
- 子类重写方法时,参数范围不能比父类更窄,返回类型不能比父类更宽(协变返回除外)
- 子类不能在重写方法中抛出父类未声明的受检异常
- 子类不应削弱父类的前置条件(如父类允许 null 输入,子类不能突然拒绝)
- 这些虽非编译强制,但违反会导致多态调用时逻辑错乱,是团队协作的重要隐性规范

















