子类覆盖父类方法是意图明确的行为,分为完全替换、补充增强和条件性调整三种;必须用super()安全调用父类逻辑,遵守接口契约,静态成员属遮蔽而非继承。

子类覆盖父类方法不是“删掉重写”,而是有明确意图地替换、增强或调整行为——关键在于是否保留父类逻辑,以及如何安全调用它。
覆盖的三种典型意图与写法
写子类方法前,先确认目的:
-
完全替换:不依赖父类实现,直接提供新逻辑。例如
Dog.speak()返回"Woof!",完全不用Animal.speak() -
补充增强:先执行父类逻辑,再追加子类操作。常见于构造函数和生命周期方法,必须用
super() - 条件性调整:父类逻辑照常运行,但根据子类状态做分支处理。比如日志记录后,仅对管理员用户触发额外通知
用 super() 显式调用父类实现
super 是访问父类方法的唯一推荐方式,它按 MRO(方法解析顺序)自动定位,避免硬编码父类名带来的耦合。
- 构造函数中必须写
super(...),确保所有父类初始化逻辑被执行 - 普通实例方法中用
super.methodName()复用校验、日志、清理等通用逻辑 - 静态方法中也可用
super.staticMethod(),但不能用super访问静态属性 - 注意:
super返回的是“下一个类”的代理对象,不是当前类的父类本身
保持接口契约,避免破坏多态
覆盖不是随意改写,要尊重父类定义的调用约定:
- 参数个数、类型、顺序必须一致;新增可选参数可用默认值或
...args兼容旧调用 - 返回值类型应兼容,若结构变化大,建议新增专用方法,而非扭曲原方法语义
- 文档字符串建议注明“扩展了父类 behavior”,方便协作者理解差异
- 避免隐式覆盖:以双下划线开头的方法(如
__helper)会被名称改写,子类无法重写——这是设计提示,说明它属于内部实现细节
静态成员的覆盖是遮蔽,不是继承
静态方法和属性不会自动继承到子类上,子类同名声明只是“遮蔽”父类对应成员,两者互不影响:
-
Child.staticProp为undefined,除非显式赋值或通过Parent.staticProp访问 - 子类可定义同名
static get()并在其中调用super.get(),此时super指向父类静态方法 - 父类静态值未被修改,仍可通过
Parent.staticProp直接读取
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











