规范子类代码需明确继承目的(is-a关系)、显式调用父类构造器、重写方法必加@override并遵循lsp、合理使用访问修饰符与final控制继承边界,使继承关系本身成为清晰文档。

编写规范的子类代码,核心是遵循面向对象设计原则,同时兼顾可读性、可维护性和 Java 语言特性。重点不是“能运行”,而是“别人(包括未来的你)能快速理解意图、安全地扩展或修改”。
明确继承目的,优先考虑组合
继承表达的是“is-a”关系(比如 Dog is-a Animal),不是为了复用代码而强行继承。如果只是为了复用逻辑,优先用组合(has-a)+ 接口。
- 反例:为复用工具方法,让
OrderService继承StringUtils—— 语义错误,且违反单一职责 - 正例:定义
Flyable接口,Drone和Plane都实现它;需要复用飞行逻辑时,内部组合一个FlyBehavior类
子类构造器必须显式调用父类构造器
Java 不会自动插入 super(),除非父类有无参构造器且你没写任何构造器。一旦父类只有带参构造器,子类必须在第一行用 super(...) 显式调用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不写
super(...)且父类无默认构造器 → 编译失败 - 子类构造器中,
super(...)或this(...)必须是第一行语句 - 建议:即使父类有无参构造器,也显式写出
super(),增强可读性与健壮性
重写方法要遵守 @Override + LSP 原则
所有重写(override)父类方法的地方,必须加 @Override 注解。它不只是提示,更是编译期检查——拼错方法名、参数类型不对、返回值不协变,都会报错。
- 重写后行为不能违背父类契约:输入相同,子类结果应兼容父类预期(里氏替换原则)
- 避免在重写方法中抛出父类未声明的受检异常(
Exception及其子类) - 若父类方法是
final、private或static,不能重写(此时加@Override会编译失败)
合理使用访问修饰符与 final 控制继承边界
不是所有类和方法都该被继承或重写。主动设计继承体系的“开放-封闭”边界:
- 用
protected暴露给子类的字段/方法,而非public(避免外部直接依赖) - 关键不变逻辑用
final修饰方法(如模板方法模式中的骨架方法) - 若类本身不设计为基类,就加
final修饰整个类(如String、LocalDateTime) - 子类中新增的 public 方法,应有清晰职责,不破坏父类抽象层次
不复杂但容易忽略:规范的子类不是语法正确就行,而是让继承关系本身成为文档——看到 class AdminUser extends User,就能自然推断行为边界与扩展点在哪里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










