在Java里如何使用super调用父类方法_Java继承关系解析-java教程

super只能在子类非静态方法或构造器中使用:构造器首行调用super()初始化父类,实例方法中用super.method()调用被重写父类方法;静态上下文、接口体等场景禁止使用。

super调用父类方法时,必须在子类非静态方法或构造器中使用

在Java中,super不是万能的“父类引用”,它只在有明确继承上下文且对象已部分构建时才有效。最常见误用是试图在静态方法里写 super.method() —— 编译直接报错:non-static variable super cannot be referenced from a static context。

真正可用的场景只有两个:

  • 在子类构造器第一行调用 super(...)(显式或隐式),用于初始化父类状态
  • 在子类实例方法中用 super.methodName() 调用被重写的父类方法

注意:不能在静态方法、静态代码块、lambda 表达式或接口默认方法(除非该接口方法被类继承并重写)中使用 super。

重写方法里调用 super.xxx() 与直接写 xxx() 的行为差异

关键区别在于绑定时机:super.xxx() 强制调用父类版本(编译期绑定),而 this.xxx() 或裸调用 xxx() 是运行时动态绑定,可能触发多态调用到当前对象实际类型的重写版本。

立即学习“Java免费学习笔记(深入)”;

比如父类 A 有 log(),子类 B extends A 重写了它,又在 B 中定义新方法 print():

void print() {
    super.log(); // 总是执行 A.log()
    log();       // 如果 print() 被 C extends B 调用,且 C 也重写了 log(),这里会执行 C.log()
}

这种差异在模板方法模式或回调链中特别关键——漏写 super. 可能导致父类初始化逻辑被跳过。

super() 必须是构造器的第一条语句,且不能和 this() 共存

Java 规定子类构造器要么以 super(...) 开头,要么以 this(...) 开头,二者互斥。如果没写任何显式调用,编译器会自动插入 super()(无参);但一旦父类没有无参构造器,就会编译失败。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里如何使用super调用父类方法_Java继承关系解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997559+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997559+
  • 本周更新: 0+
  • 最后更新: 2026-03-16