0

0

什么是Java中的方法重写 (Override) 与隐藏 (Hiding)_实例与静态的差异

P粉602998670

P粉602998670

发布时间:2026-02-23 16:45:46

|

506人浏览过

|

来源于php中文网

原创

java中static方法不能被重写只能被隐藏,因其实现静态绑定(看引用声明类型),而实例方法是动态绑定(看实际对象类型);字段同理只有隐藏无重写。

什么是java中的方法重写 (override) 与隐藏 (hiding)_实例与静态的差异

为什么子类里写了个同名方法,有时候调用的是父类的?

因为 Java 里 static 方法不能被重写(override),只能被隐藏(hiding)。这是最常让人困惑的根源:看起来一样,行为却完全不同。

关键区别在绑定时机——实例方法是运行时动态绑定(看实际对象类型),static 方法是编译时静态绑定(看引用变量声明类型)。

  • 如果你用 Parent p = new Child();,再调 p.staticMethod(),执行的是 Parent.staticMethod()
  • 同样代码下,调 p.instanceMethod(),执行的是 Child.instanceMethod()
  • 哪怕 Child 里写了 public static void instanceMethod()(加了 static),它也不是重写,而是意外地把实例方法“遮住”了——编译都过不去

怎么一眼判断是 Override 还是 Hiding?

看方法签名是否满足重写条件,再看有没有 static。不满足重写条件 + 带 static → 隐藏;满足重写条件 + 不带 static → 重写。

重写的硬性要求:@Override 注解能通过、返回类型协变、访问权限不能更严格、异常不能新增检查型异常。

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

Wordtune
Wordtune

你的个人写作助手和编辑,通过清晰、引人注目和真实的写作准确表达您的意思。

下载
  • static 方法加 @Override → 编译错误:method does not override or implement a method from a supertype
  • 子类方法参数列表和父类不一致 → 不是重写,也不是隐藏,就是个新方法(overload)
  • 父类方法是 private → 子类同名方法一定是新方法,既不是重写也不是隐藏(private 不参与继承)

重写和隐藏在多态调用中表现不同

多态只对实例方法生效。所谓“父类引用指向子类对象”,这个“多态性”对 static 方法完全无效。

class A { static void f() { System.out.println("A.f"); } }
class B extends A { static void f() { System.out.println("B.f"); } }
A x = new B();
x.f(); // 输出 "A.f" —— 看的是 x 的声明类型 A

换成实例方法:

class A { void f() { System.out.println("A.f"); } }
class B extends A { void f() { System.out.println("B.f"); } }
A x = new B();
x.f(); // 输出 "B.f" —— 看的是 new B() 的实际类型
  • 别指望靠改引用类型来“切换” static 方法行为;它根本不响应运行时类型
  • 如果真需要类似多态的静态行为,得手动用工厂、策略类或反射,而不是依赖方法名重复

容易被忽略的坑:字段也有隐藏,但没有重写

字段(成员变量)也存在隐藏,但 Java 根本不存在“字段重写”。哪怕子类定义了同名 public int x,它和父类的 x 是两个独立变量。

访问哪个字段,取决于引用类型,不是实际对象类型——这点和 static 方法一致,但和实例方法相反。

  • ((A)new B()).x 访问的是 A.x((B)new B()).x 访问的是 B.x
  • 这导致用 getter/setter 封装字段很重要:只有方法能真正实现运行时多态,字段永远静态绑定
  • IDE 提示“field hides another field”不是警告,是事实陈述——你确实藏了一个字段,而且很可能自己都没意识到
字段隐藏和 static 方法隐藏一样,不报错、不抛异常、也不触发多态,只是静默地按声明类型取值。这种“看似继承实则割裂”的行为,在调试时最容易漏掉。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

24

2025.11.27

string转int
string转int

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

830

2023.08.02

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

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

580

2024.08.29

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

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

294

2025.08.29

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

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

210

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

java中void的含义
java中void的含义

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

124

2025.11.27

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1118

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

355

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.8万人学习

C# 教程
C# 教程

共94课时 | 10万人学习

Java 教程
Java 教程

共578课时 | 70.9万人学习

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

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