首页 > 趣闻 > 正文内容

重写方法后如何调用父类方法?Java继承开发技巧分享

趣闻2025-05-27 17:19:56

"我明明继承了父类,为什么重写方法后原来的功能就消失了?"——上周在公司带新人时,听到这个灵魂发问。今天咱们就聊聊这个让无数Java新手抓狂的问题,保证你看完就能掌握这个继承体系的通关秘籍!


一、先搞明白:方法重写不是覆盖是升级

(敲桌子)??重写方法就像给手机系统升级,新版本要兼容旧功能??。但很多新手一上来就删光父类代码,结果连基础功能都丢了。举个现实案例:

java复制
class 老式电饭煲 {
    void 煮饭() {
        System.out.println("大火煮20分钟");
        System.out.println("自动保温");
    }
}

class 智能电饭煲 extends 老式电饭煲 {
    @Override
    void 煮饭() {
        // 新手常犯的错误:完全重写
        System.out.println("手机预约启动");
    }
}

这时候调用智能电饭煲的煮饭方法,老电饭煲的"自动保温"功能就永久丢失了。??正确做法应该像做三明治——保留底层,添加新料??。


二、super的正确打开方式

(拍大腿)想要旧功能不丢失,记住这个万能口诀:??"要创新,先继承"??。咱们用具体场景来说话:

场景1:基础功能+扩展功能

java复制
class 银行基础服务 {
    void 转账() {
        System.out.println("验证身份");
        System.out.println("执行转账");
    }
}

class 智能银行 extends 银行基础服务 {
    @Override
    void 转账() {
        super.转账(); // 先保留父类核心流程
        System.out.println("发送短信通知");
        System.out.println("生成电子凭证");
    }
}

??关键点??:就像做红烧肉要先焯水,super调用必须放在方法开头,否则执行顺序会乱套。


场景2:选择性使用父类功能

(扶眼镜)有时候不需要全部父类方法,这时候可以像挑西瓜一样只取需要的部分:

java复制
class 传统相机 {
    void 拍照() {
        System.out.println("打开镜头盖");
        System.out.println("机械快门");
        System.out.println("冲洗胶卷");
    }
}

class 数码相机 extends 传统相机 {
    @Override
    void 拍照() {
        // 只保留需要的父类操作
        System.out.println("打开镜头盖"); 
        System.out.println("电子快门");
        System.out.println("保存SD卡");
    }
}

这时候就不需要调用super,??但要特别注意:如果父类方法有重要逻辑(比如资源释放),手动重写时千万不能漏掉??。


三、那些年我踩过的坑(新手避雷指南)

  1. ??静态方法不能用super??:就像不能用筷子喝汤,static方法是类级别的,super是对象级别的
  2. ??构造方法暗藏玄机??:子类构造方法第一行默认有super(),如果父类没有无参构造,编译直接报错
  3. ??多层继承容易迷路??:试图用super.super调用爷爷类的方法?别想了,Java压根不支持这种套娃操作!

真实案例分享:去年有个实习生写支付回调功能,重写方法时忘了调用super.handle(),结果导致整个交易流水没入库。最后排查三天才发现是这个super没写,??你看,框架源码里处处都是super的埋伏??!


四、高手都在用的进阶技巧

(点烟)说几个教科书上不会写的实战经验:

  1. ??模板方法模式??:父类定义算法骨架,子类重写特定步骤
java复制
abstract class 烹饪模板 {
    final void 做菜() { // final防止子类破坏流程
        准备食材();
        加工处理();
        装盘();
    }
    
    abstract void 加工处理();
}
  1. ??钩子方法??:父类提供可选扩展点
java复制
class 快递流程 {
    void 发货() {
        打包();
        if(需要保价()) 保价操作();
        物流运输();
    }
    
    // 钩子方法
    boolean 需要保价() { 
        return false;
    }
}
  1. ??防御性重写??:在重写方法开头先调用super,避免遗漏核心逻辑

个人观点时间

(倒茶)说句掏心窝子的话:??super就像家里的传家宝,用好了能省力,用错了会闯祸??。见过最极端的两种情况:

有人在每个重写方法里都无脑写super,结果导致父类方法被重复调用;也有人像防贼一样完全不用super,把父类代码全复制一遍。这两种做法都不可取!

我的经验法则是:??当父类方法像ATM机的取款流程一样有严格顺序时,必须用super保留原有逻辑;如果是工具箱里的独立工具,可以自由选择调用方式??。

最后送大家一句话:继承是把双刃剑,super就是剑柄上的防滑纹。握紧了能斩棘披荆,握松了可能伤到自己。下次重写方法时,不妨先问自己:这个super,到底该不该存在?

搜索