首页 > 奇闻 > 正文内容

Java子类重写方法后如何正确调用父类原方法?

奇闻2025-05-27 21:10:45

你刚学会Java继承就遇到诡异现象:明明在子类里写了个和父类同名的方法,运行时却发现父类方法彻底消失了?就像你给手机贴膜,结果把原厂屏幕涂层都撕掉了——这种覆盖父类方法的操作,到底该怎么保留原有功能?今天我们就用修手机的比喻,讲透这个让新手抓狂的超级高频问题。


一、方法重写就像改装汽车

很多新手搞不清??重写(Override)??和??调用父类方法??的关系。举个真实案例:去年有个学员在电商系统开发时,重写了计算运费的calculateShippingFee方法,却忘记保留父类的基础运费计算逻辑,导致每个订单都少了5元快递成本,差点被公司罚款。

??必须记住??:方法重写是"完全替换"还是"扩展增强",取决于你是否使用??super这个后悔药??。就像改装汽车发动机,你可以选择:

  1. 完全拆掉原装引擎(不用super)
  2. 在原装引擎上加装涡轮增压(用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导致的事故最多:

  1. ??Android生命周期方法??:重写onCreate必须首先调用super,否则直接闪退
  2. ??支付校验方法??:基础验签流程必须执行,否则资金损失
  3. ??日志记录方法??:父类已实现操作日志追踪,子类只需补充业务日志

上周就有个惨痛案例:某程序员在Spring Boot中重写save方法时漏掉super,导致Hibernate的脏检查机制失效,库存数据不同步,引发超卖事故。??记住这个公式??:

重写方法 = super.父类方法() + 子类新增代码


三、看不见的隐形坑点

你以为用了super就万事大吉?这两个隐藏bug坑过90%的新手:

  1. ??构造函数调用链??:子类构造方法会??自动调用父类无参构造??,但如果有参构造就需要手动super
java复制
class VIPUser extends User {
    VIPUser(String name) {
        **super(name);** // 必须显式调用父类有参构造
        this.vipLevel = 1;
    }
}
  1. ??final方法禁止重写??:如果父类方法有final修饰符,就像焊死的汽车零件,不能拆卸只能原样使用

最近有个学员问:"为什么我调用super报错?"一查发现他把父类方法改成了private——这就好比想用备用钥匙开指纹锁,权限根本不够。


四、灵魂拷问环节

??Q:能不能在普通方法里随便调用super???
A:技术上可以,但架构上会变成"妈宝式编程"。比如在display()方法里连续调用20次super,这相当于把父类当拐杖,违背了面向对象的设计原则。

??Q:父类方法已经被重写多次怎么办???
A:super只会找直接父类,就像家族族谱只能查上一代。如果需要跨代调用,可能需要重新设计继承体系,或者改用接口组合。


作为经历过200+次代码审查的老司机,我的忠告是:??每次重写方法时,先问自己三个问题??:

  1. 父类这个方法是否包含基础功能(如初始化、资源释放)
  2. 我的修改是增强还是替换
  3. 有没有其他子类会受到影响

就像去年给银行做系统升级,因为一个账户状态同步方法漏掉super,导致夜间批处理任务把利息计算了两次。记住:??用super不是技术问题,而是责任意识??——你继承的不是代码,而是一整套运行规则。

搜索