0

0

在Java中方法调用是如何绑定的_Java静态绑定与动态绑定解析

P粉602998670

P粉602998670

发布时间:2026-02-04 10:07:21

|

605人浏览过

|

来源于php中文网

原创

Java方法绑定由声明特征和调用上下文决定:static、private、final实例方法及构造方法走静态绑定,使用invokestatic或invokespecial指令;非static、非private、非final且被正确重写的实例方法走动态绑定,使用invokevirtual指令查vtable。

在java中方法调用是如何绑定的_java静态绑定与动态绑定解析

Java 中方法调用的绑定方式不是由“写法”决定的,而是由方法声明特征(是否 staticfinalprivate,是否被重写)和调用上下文共同决定的。静态绑定在编译期完成,动态绑定在运行期根据实际对象类型分派。

哪些方法走静态绑定

编译器能直接确定调用目标的方法,不依赖运行时对象类型:

  • static 方法:绑定到声明类,与实例无关,Parent p = new Child(); p.staticMethod() 仍调用 Parent.staticMethod
  • private 方法:隐式 final,仅在本类可见,子类里同名方法是全新方法,不是重写
  • final 实例方法:禁止重写,编译期可锁定目标
  • 构造方法:本质是 static 的特殊函数,只属于当前类

这些方法调用在字节码中是 invokestaticinvokespecial 指令,无多态性。

哪些方法走动态绑定

只有满足以下全部条件,才触发运行时动态绑定(即虚拟方法调用):

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

雾象
雾象

WaytoAGI推出的AI动画生成引擎

下载
  • 是非 static、非 private、非 final 的实例方法
  • 在子类中被正确重写(签名一致 + 可见性不降级)
  • 通过引用变量调用,且该变量声明类型是父类,实际指向子类对象(如 Animal a = new Dog()

此时字节码使用 invokevirtual 指令,JVM 在运行时查对象的实际类的虚方法表(vtable)来定位具体实现。注意:static 方法即使“看起来被重写”,也不会进入 vtable,不参与动态绑定。

容易混淆的典型错误场景

开发者常误以为“重写了就一定动态绑定”,但很多情况会意外退回到静态绑定:

  • 子类方法加了 static:父类是实例方法,子类改成 static → 不是重写,是隐藏(hiding),调用取决于引用类型,不是实际类型
  • 参数列表不同:只是重载(overload),不是重写(override),编译期按引用类型 + 参数类型匹配,绑定发生在编译期
  • 返回类型协变但访问修饰符缩小(如父类 public,子类写 protected):编译失败,根本不会生成重写关系
  • 泛型擦除导致签名实际不同:例如父类 void foo(List),子类 void foo(ArrayList) → 是重载,不是重写

如何验证绑定行为

最直接的方式是看字节码或调试时观察实际执行路径:

  • javap -c MyClass 查看调用指令:出现 invokestatic / invokespecial 就是静态绑定;invokevirtual 才可能动态绑定
  • 在 IDE 中打断点:对动态绑定方法,在子类实现处断点能命中;静态绑定方法则永远停在声明类里
  • 把子类方法临时改成 privatestatic,观察行为是否突变 —— 若调用结果变了,说明原来确实是动态绑定在起作用

真正关键的不是记住“什么情况下绑定”,而是理解 JVM 如何依据修饰符和继承关系构建方法解析规则。很多诡异问题,根源都在某个看似普通的 static 或参数类型偏差上。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

563

2023.08.02

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

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

17

2025.11.27

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

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

17

2025.11.27

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

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

17

2025.11.27

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

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

177

2023.11.23

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

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

104

2025.11.27

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

103

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

49

2026.02.03

热门下载

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

精品课程

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

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.4万人学习

Java 教程
Java 教程

共578课时 | 56.6万人学习

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

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