
嘻道奇闻
- 文章199742
- 阅读14625734
Java中super的正确用法:构造方法+成员方法调用指南
你是不是经常在Java代码里看到super这个单词,却总搞不懂它到底该什么时候用?明明照着教程写了却总是报错?今天咱们就用煮泡面的方式来聊聊这个让新手抓狂的关键字——保证你看完就能煮出一碗不糊不夹生的"super泡面"!
(突然停顿)等等,先看这个真实案例:去年有个小哥在GitHub提交的代码,因为漏写super()导致整个SpringBoot项目启动失败。评论区炸出二十几个"我也有过这个bug"的回复,你看,这问题坑过多少好汉!
一、构造方法里的隐形客人
刚学继承时我就纳闷:明明子类构造方法空着没写,怎么还能调用父类的方法?后来才发现,??Java偷偷给每个构造方法塞了句super()??,就像泡面包装里自带的调料包。
但这里有个大坑!当父类没有无参构造时:
java复制class 老爹银行卡 { 老爹银行卡(String 密码) { // 有参构造 System.out.println("密码设置成功:" + 密码); } } class 儿子银行卡 extends 老爹银行卡 { 儿子银行卡() { // 这里会报错!因为父类没有无参构造 System.out.println("开通免密支付"); } }
正确姿势是手动加料:
java复制儿子银行卡() { super("123456"); // 必须显式调用 System.out.println("开通免密支付"); }
这就好比老爹的保险箱换了指纹锁,儿子想继承必须录指纹——??子类构造方法必须与父类构造方法参数匹配??。
二、成员方法调用的三大铁律
- ??要热剩饭先翻热??:重写方法时先调用父类方法
java复制class 老式空调 { void 制冷() { System.out.println("压缩机启动"); } } class 智能空调 extends 老式空调 { @Override void 制冷() { super.制冷(); // 先保证基础功能 System.out.println("手机远程控制"); } }
- ??别把遥控器当锤子用??:静态方法里别用super
java复制class 错误示范 { static void 报错方法() { super.toString(); // 直接编译扑街 } }
- ??套娃要有限度??:super不能跨代调用
java复制class 爷爷 { void 讲故事() {} } class 爸爸 extends 爷爷 {} class 儿子 extends 爸爸 { void 听故事() { super.super.讲故事(); // 想都别想! } }
三、实战对比手册(建议贴在显示器上)
场景 | 正确姿势 | 作死操作 | 后果 |
---|---|---|---|
父类有无参构造 | 不用写super() | 非要写super("123") | 编译直接红牌 |
重写equals方法 | super.equals()+额外判断 | 完全自己重写 | 可能破坏集合类操作 |
多层继承初始化 | 逐层super调用 | 跨级调用 | 编译器翻脸不认人 |
(突然拍桌)注意看第三行!上周公司有个实习生写三层继承时,试图在孙子类直接调用爷爷类方法,结果项目编译报错愣是查了两天。血的教训告诉我们:??Java的继承就像爬楼梯,必须一层层往上走??。
四、那些教科书不会告诉你的冷知识
- ??super不是变量??:有人试图把super赋值给Object对象,结果被编译器狠狠打脸
- ??匿名内部类陷阱??:在匿名类里用super,实际指向的是父类而不是外层类
- ??Lambda表达式禁区??:Lambda里不能使用super,就像不能用筷子吃牛排
看个奇葩案例:
java复制class 奇葩操作 { void 作死尝试() { Object obj = super; // 这里直接报错 // super只是个关键字,不是对象引用 } }
小编的私房话
干了五年Java开发,见过最离谱的super用法是在try-catch块里循环调用super方法,美其名曰"增强稳定性"。结果导致父类方法被重复调用十几次,把数据库连接池直接榨干。
我的编程哲学是:??super就像辣椒酱,少量提味,过量伤身??。在以下两种场景必须使用:
- 框架强制要求(比如重写Android的onCreate方法)
- 父类方法包含核心资源操作(比如文件流关闭)
最后送大家一个自创的super使用口诀:
构造方法要传参,super必须第一行
重写方法想保底,super先来打个样
静态匿名别硬闯,跨级调用是妄想
用对场景像开挂,乱用迟早要背锅
(端起保温杯)下次看到super时,不妨先问自己:这个调用是不是像给旧手机贴膜——既要保护原有屏幕,又不能影响触控功能?想通了这个问题,你就掌握了继承的精髓。