
嘻道奇闻
- 文章199742
- 阅读14625734
super关键字的正确使用:Java继承中父类方法调用详解
社会2025-05-27 13:42:22
刚学Java那会儿,我在笔记本上写了十几次"super.方法()",结果每次运行都报错。直到有天导师说了句:"小伙子,你这不是在用筷子吃牛排吗?" 今天咱们就聊聊,??这个让新手又爱又恨的super关键字,到底该怎么使??。
一、super不是备胎,是直通车
很多小白以为super就是个替代方案,其实它更像是??直达父类的高速公路??。来看这段真实案例:
java复制class 燃油车 { void 启动() { System.out.println("轰隆隆~引擎发动"); } } class 电动车 extends 燃油车 { @Override void 启动() { // 这里埋个雷 System.out.println("滴——电力系统就绪"); super.启动(); } }
运行后会先输出电动车的启动提示,接着父类的引擎声——??顺序完全反了??!正确做法是把super放在方法开头:
java复制void 启动() { super.启动(); // 正确的打开方式 System.out.println("滴——电力系统就绪"); }
二、构造方法里的生死局
新手最容易栽在构造方法上。上周有个学员的报错代码:
java复制class 手机 { 手机(int 电量) { System.out.println("剩余电量:" + 电量); } } class 智能手表 extends 手机 { 智能手表() { // 这里会爆炸! } }
??为什么报错??? 因为子类构造方法默认调用父类无参构造,但父类没有!解决方案就像给机器装电池:
java复制智能手表() { super(80); // 相当于塞了块满电电池 }
三、方法重写的双刃剑
当子类要修改父类方法时,??super是保留原有功能的救命稻草??。对比两种写法:
错误写法 | 正确写法 |
---|---|
完全覆盖父类功能 | 保留父类功能+新增特性 |
导致功能丢失 | 实现功能叠加 |
举个支付系统的例子:
java复制class 老支付系统 { boolean 验证() { // 旧版验证逻辑 return true; } } class 新支付系统 extends 老支付系统 { @Override boolean 验证() { if(!super.验证()) return false; // 先用老系统验 // 追加人脸识别验证 return true; } }
四、自问自答环节
??Q:super能调用爷爷类的方法吗???
A:想得美!super只能直达父类,就像电梯只能上一层楼。要调用爷爷辈的方法,得在父类里留个通道
??Q:什么时候必须用super???
A:两个场景:①构造方法参数不匹配时 ②重写方法但需要保留父类功能时。就像改装汽车必须保留刹车系统
??Q:super和this有什么区别???
A:??this找自己,super找爸爸??。this能调用本类任意方法,super只能访问父类可见方法
个人观点
教了五年Java,见过太多学生把super当摆设。记住三句话:??构造方法要传参、方法重写放开头、私有方法别硬来??。最后说句大实话——别怕报错,多试几次super的位置,比看十篇教程都管用。你现在就可以打开IDE,把我举的电动车案例敲一遍,保准比死记概念强十倍!