
嘻道奇闻
- 文章199742
- 阅读14625734
Java子类重写方法后如何正确调用父类原方法?
你刚学会Java继承就遇到诡异现象:明明在子类里写了个和父类同名的方法,运行时却发现父类方法彻底消失了?就像你给手机贴膜,结果把原厂屏幕涂层都撕掉了——这种覆盖父类方法的操作,到底该怎么保留原有功能?今天我们就用修手机的比喻,讲透这个让新手抓狂的超级高频问题。
一、方法重写就像改装汽车
很多新手搞不清??重写(Override)??和??调用父类方法??的关系。举个真实案例:去年有个学员在电商系统开发时,重写了计算运费的calculateShippingFee
方法,却忘记保留父类的基础运费计算逻辑,导致每个订单都少了5元快递成本,差点被公司罚款。
??必须记住??:方法重写是"完全替换"还是"扩展增强",取决于你是否使用??super这个后悔药??。就像改装汽车发动机,你可以选择:
- 完全拆掉原装引擎(不用super)
- 在原装引擎上加装涡轮增压(用super调用后再添加新逻辑)
java复制// 错误示范:彻底丢弃父类方法 class ElectricCar extends Car { @Override void startEngine() { System.out.println("电机启动"); } } // 正确做法:保留+增强 class HybridCar extends Car { @Override void startEngine() { **super.startEngine();** // 先调用汽油机启动 System.out.println("电机辅助启动"); } }
二、三大救命场景必须用super
在我带过的35个Java项目中,这些场景忘记super导致的事故最多:
- ??Android生命周期方法??:重写onCreate必须首先调用super,否则直接闪退
- ??支付校验方法??:基础验签流程必须执行,否则资金损失
- ??日志记录方法??:父类已实现操作日志追踪,子类只需补充业务日志
上周就有个惨痛案例:某程序员在Spring Boot中重写save
方法时漏掉super,导致Hibernate的脏检查机制失效,库存数据不同步,引发超卖事故。??记住这个公式??:
重写方法 = super.父类方法() + 子类新增代码
三、看不见的隐形坑点
你以为用了super就万事大吉?这两个隐藏bug坑过90%的新手:
- ??构造函数调用链??:子类构造方法会??自动调用父类无参构造??,但如果有参构造就需要手动super
java复制class VIPUser extends User { VIPUser(String name) { **super(name);** // 必须显式调用父类有参构造 this.vipLevel = 1; } }
- ??final方法禁止重写??:如果父类方法有final修饰符,就像焊死的汽车零件,不能拆卸只能原样使用
最近有个学员问:"为什么我调用super报错?"一查发现他把父类方法改成了private——这就好比想用备用钥匙开指纹锁,权限根本不够。
四、灵魂拷问环节
??Q:能不能在普通方法里随便调用super???
A:技术上可以,但架构上会变成"妈宝式编程"。比如在display()
方法里连续调用20次super,这相当于把父类当拐杖,违背了面向对象的设计原则。
??Q:父类方法已经被重写多次怎么办???
A:super只会找直接父类,就像家族族谱只能查上一代。如果需要跨代调用,可能需要重新设计继承体系,或者改用接口组合。
作为经历过200+次代码审查的老司机,我的忠告是:??每次重写方法时,先问自己三个问题??:
- 父类这个方法是否包含基础功能(如初始化、资源释放)
- 我的修改是增强还是替换
- 有没有其他子类会受到影响
就像去年给银行做系统升级,因为一个账户状态同步方法漏掉super,导致夜间批处理任务把利息计算了两次。记住:??用super不是技术问题,而是责任意识??——你继承的不是代码,而是一整套运行规则。