首页 > 投稿 > 正文内容

Java中super的正确用法:构造方法+成员方法调用指南

投稿2025-05-28 06:57:32

你是不是经常在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("开通免密支付");
}

这就好比老爹的保险箱换了指纹锁,儿子想继承必须录指纹——??子类构造方法必须与父类构造方法参数匹配??。


二、成员方法调用的三大铁律

  1. ??要热剩饭先翻热??:重写方法时先调用父类方法
java复制
class 老式空调 {
    void 制冷() {
        System.out.println("压缩机启动");
    }
}

class 智能空调 extends 老式空调 {
    @Override
    void 制冷() {
        super.制冷(); // 先保证基础功能
        System.out.println("手机远程控制");
    }
}
  1. ??别把遥控器当锤子用??:静态方法里别用super
java复制
class 错误示范 {
    static void 报错方法() {
        super.toString(); // 直接编译扑街
    }
}
  1. ??套娃要有限度??:super不能跨代调用
java复制
class 爷爷 { void 讲故事() {} }
class 爸爸 extends 爷爷 {}
class 儿子 extends 爸爸 {
    void 听故事() {
        super.super.讲故事(); // 想都别想!
    }
}

三、实战对比手册(建议贴在显示器上)

场景正确姿势作死操作后果
父类有无参构造不用写super()非要写super("123")编译直接红牌
重写equals方法super.equals()+额外判断完全自己重写可能破坏集合类操作
多层继承初始化逐层super调用跨级调用编译器翻脸不认人

(突然拍桌)注意看第三行!上周公司有个实习生写三层继承时,试图在孙子类直接调用爷爷类方法,结果项目编译报错愣是查了两天。血的教训告诉我们:??Java的继承就像爬楼梯,必须一层层往上走??。


四、那些教科书不会告诉你的冷知识

  1. ??super不是变量??:有人试图把super赋值给Object对象,结果被编译器狠狠打脸
  2. ??匿名内部类陷阱??:在匿名类里用super,实际指向的是父类而不是外层类
  3. ??Lambda表达式禁区??:Lambda里不能使用super,就像不能用筷子吃牛排

看个奇葩案例:

java复制
class 奇葩操作 {
    void 作死尝试() {
        Object obj = super; // 这里直接报错
        // super只是个关键字,不是对象引用
    }
}

小编的私房话

干了五年Java开发,见过最离谱的super用法是在try-catch块里循环调用super方法,美其名曰"增强稳定性"。结果导致父类方法被重复调用十几次,把数据库连接池直接榨干。

我的编程哲学是:??super就像辣椒酱,少量提味,过量伤身??。在以下两种场景必须使用:

  1. 框架强制要求(比如重写Android的onCreate方法)
  2. 父类方法包含核心资源操作(比如文件流关闭)

最后送大家一个自创的super使用口诀:
构造方法要传参,super必须第一行
重写方法想保底,super先来打个样
静态匿名别硬闯,跨级调用是妄想
用对场景像开挂,乱用迟早要背锅

(端起保温杯)下次看到super时,不妨先问自己:这个调用是不是像给旧手机贴膜——既要保护原有屏幕,又不能影响触控功能?想通了这个问题,你就掌握了继承的精髓。

搜索