0

0

在Java里super关键字如何使用_Java父类访问机制解析

P粉602998670

P粉602998670

发布时间:2026-02-09 15:24:09

|

138人浏览过

|

来源于php中文网

原创

super仅在子类构造器、实例方法和字段初始化中有效,必须位于构造器首行,不能用于静态上下文;可访问父类非private成员,但字段访问不触发多态,方法调用跳过当前重写。

在java里super关键字如何使用_java父类访问机制解析

super 不是万能的父类访问开关,它只在子类构造器、实例方法和实例字段初始化中有效,且不能脱离继承链使用。

super() 必须是构造器第一行调用

Java 规定:如果子类构造器没显式写 super()this(),编译器会自动插入无参 super()。但一旦父类没有无参构造器,就会报错 Constructor not defined

  • 必须手动调用带参 super(…),且只能出现在第一行
  • 不能在普通方法里调用 super() —— 这不是方法,是构造器调用语法
  • 如果父类只有 protected Parent(String s),子类必须写 super("x"),否则编译失败

super.字段名 只能访问被子类隐藏(shadow)的父类字段

当子类定义了与父类同名的实例字段(非重写),super.field 是唯一能访问父类该字段的方式;但如果字段是 private,即使加 super. 也访问不到 —— 编译直接拒绝。

  • 父类 public String name = "A";,子类 String name = "B";super.name 得到 "A"
  • 父类 private int id;super.id 编译错误id has private access in Parent
  • 字段访问不触发多态,跟方法不同;super.name 拿的是父类对象内存里的值,不是运行时动态绑定

super.方法名() 调用的是父类版本,但受访问修饰符和重写规则约束

这是最易混淆的点:super.method() 强制跳过当前类重写逻辑,回到父类实现,但前提是该方法可被访问(即不是 private),且父类方法确实存在(不是 abstract 且未被子类彻底覆盖)。

Getfloorplan
Getfloorplan

创建 2D、3D 平面图和 360° 虚拟游览,普通房间变成梦想之家

下载

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

  • 父类 public void log() { System.out.println("P"); },子类重写为 public void log() { System.out.println("C"); }super.log() 输出 "P"
  • 父类 private void helper() { } → 子类中写 super.helper() 编译失败
  • 父类 abstract void run(); → 子类实现后,super.run() 合法(调用父类抽象声明的语义位置),但运行时报 AbstractMethodError(除非父类有默认实现)

super 在静态上下文或接口实现中完全不可用

super 是对“当前对象的父类部分”的引用,本质依赖 this 实例。因此所有静态方法、静态块、接口 default 方法(若在实现类中想调接口的 super)都不能用 super

  • static void init() { super.xxx; } 中写 super → 编译错误:non-static variable super cannot be referenced from a static context
  • 接口 Adefault void say() { },实现类 B 重写了 say(),想在内部调回接口版?不行 —— super.say() 在类中无效;正确写法是 A.super.say()(仅限在实现类的方法体中)
  • lambda 表达式或匿名内部类里用 super,指向的是其直接 enclosing 类的父类,不是 lambda 所在方法的“父类”——这点极易误判

真正容易被忽略的是:super 的解析发生在编译期,但它绑定的对象仍是运行时的 this。也就是说,super.toString() 看似调父类,但如果父类的 toString() 又调了被子类重写的 getName(),最终执行的还是子类版本 —— 多态不受 super 阻断,只阻断直接方法调用路径。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

647

2023.08.02

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

string转int
string转int

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

647

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

554

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

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

精品课程

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

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

Java 教程
Java 教程

共578课时 | 62.2万人学习

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

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