0

0

如何使用Java的super关键字_调用父类构造器与方法指南

P粉602998670

P粉602998670

发布时间:2026-03-06 13:25:07

|

484人浏览过

|

来源于php中文网

原创

super()必须是子类构造器第一行,否则编译报错;未显式调用时编译器自动插入无参super(),但父类须有无参构造器;super.方法仅调直接父类非private方法,不支持跳过父类调祖父类;字段遮蔽时super.字段名是安全访问父类字段的唯一方式。

如何使用java的super关键字_调用父类构造器与方法指南

super() 必须是子类构造器第一行

Java 要求子类构造器中,如果显式调用 super()this(),它必须是第一条语句。否则编译直接报错:call to super must be first statement in constructor

常见错误是想在 if 判断后才决定调用哪个父类构造器——不行,super() 不能出现在条件分支里;也不能在它前面加日志、变量声明或任何其他代码。

  • 正确写法:super(name, age) 紧贴左大括号后,无前置语句
  • 错误写法:System.out.println("init"); super(name); → 编译失败
  • 没写 super()?编译器会自动补 super()(无参),但前提是父类有无参构造器;否则报错:constructor X in class Y cannot be applied to given types

super.方法名() 不是万能的“向上找”

super.methodName() 只能调用父类**直接定义**的方法,不能跳过父类去调祖父类;而且该方法不能是 private(私有方法不可见),也不能被子类重写后又想绕过它去调更上层的版本(Java 不支持类似 Python 的 super(A, self).method() 那种指定祖先类的语法)。

典型误用场景:父类 A 有 log(),子类 B 重写了它,B 的子类 C 想调 A 版本的 log() —— 这时 super.log() 实际调的是 B 的重写版,不是 A 的原始版。

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

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

下载
  • 若真需要访问祖父类逻辑,通常得在父类 B 中暴露一个 protected final void logBase() 供 C 调用
  • super.toString() 在重写 toString() 时很常用,但要注意:如果父类实现返回 null 或空字符串,可能引发 NPE 或不符合预期
  • 静态方法不能用 super.staticMethod() 调用,只能用 ParentClass.staticMethod();用 super 调静态方法不会报错,但实际走的是编译期绑定,和 super 无关

子类字段遮蔽父类字段时,super.字段名 是唯一安全引用方式

当子类定义了和父类同名的字段(比如父类有 protected String id,子类也写 private String id),就会发生字段遮蔽(field hiding)。此时直接用 id 访问的是子类字段,而 super.id 才能明确拿到父类那个。

这和方法重写不同:字段没有动态绑定,只有遮蔽;所以不显式写 super. 很容易拿错值,尤其在构造器或 setter 中混用时容易出 bug。

  • 构造器里初始化父类字段,别写 this.id = id(可能指子类字段),应写 super.id = id
  • getter 中返回 super.id 还是 this.id,取决于你到底要暴露哪一层的数据
  • IDE 通常不会警告字段遮蔽,但编译通过不代表逻辑正确——运行时数据错位很难排查

super 在匿名内部类和 Lambda 中不可用

在匿名内部类里,super 指向的是该匿名类的直接父类(通常是某个接口或抽象类),不是外部方法所在类的父类;而在 Lambda 表达式中,根本不能出现 super 关键字,编译直接拒绝。

这意味着:如果你在匿名类里想调用外部类的父类方法,不能靠 super,得把外部类实例传进来,再通过它间接调用(比如 OuterClass.this.method(),再由 OuterClass 去调自己的 super.method())。

  • 匿名类中写 super.toString(),调的是 Object 的(因为匿名类默认继承 Object),不是外部类父类的
  • Lambda 中连 this 都指向外部类实例,super 完全不合法,语法层面禁止
  • 这种限制不是疏漏,而是设计使然:Lambda 是函数式抽象,不建立新的类层次关系

真正麻烦的地方不在语法能不能写,而在于字段遮蔽和匿名类中的 super 行为——它们不报错,但结果和直觉相反,调试时容易卡很久。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1029

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

841

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

841

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

841

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号