重写方法后如何调用父类方法?Java继承开发技巧分享
"我明明继承了父类,为什么重写方法后原来的功能就消失了?"——上周在公司带新人时,听到这个灵魂发问。今天咱们就聊聊这个让无数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,??但要特别注意:如果父类方法有重要逻辑(比如资源释放),手动重写时千万不能漏掉??。
三、那些年我踩过的坑(新手避雷指南)
- ??静态方法不能用super??:就像不能用筷子喝汤,static方法是类级别的,super是对象级别的
- ??构造方法暗藏玄机??:子类构造方法第一行默认有super(),如果父类没有无参构造,编译直接报错
- ??多层继承容易迷路??:试图用super.super调用爷爷类的方法?别想了,Java压根不支持这种套娃操作!
真实案例分享:去年有个实习生写支付回调功能,重写方法时忘了调用super.handle(),结果导致整个交易流水没入库。最后排查三天才发现是这个super没写,??你看,框架源码里处处都是super的埋伏??!
四、高手都在用的进阶技巧
(点烟)说几个教科书上不会写的实战经验:
- ??模板方法模式??:父类定义算法骨架,子类重写特定步骤
java复制abstract class 烹饪模板 { final void 做菜() { // final防止子类破坏流程 准备食材(); 加工处理(); 装盘(); } abstract void 加工处理(); }
- ??钩子方法??:父类提供可选扩展点
java复制class 快递流程 { void 发货() { 打包(); if(需要保价()) 保价操作(); 物流运输(); } // 钩子方法 boolean 需要保价() { return false; } }
- ??防御性重写??:在重写方法开头先调用super,避免遗漏核心逻辑
个人观点时间
(倒茶)说句掏心窝子的话:??super就像家里的传家宝,用好了能省力,用错了会闯祸??。见过最极端的两种情况:
有人在每个重写方法里都无脑写super,结果导致父类方法被重复调用;也有人像防贼一样完全不用super,把父类代码全复制一遍。这两种做法都不可取!
我的经验法则是:??当父类方法像ATM机的取款流程一样有严格顺序时,必须用super保留原有逻辑;如果是工具箱里的独立工具,可以自由选择调用方式??。
最后送大家一句话:继承是把双刃剑,super就是剑柄上的防滑纹。握紧了能斩棘披荆,握松了可能伤到自己。下次重写方法时,不妨先问自己:这个super,到底该不该存在?