0

0

详解Java多态中的动态绑定过程

星降

星降

发布时间:2026-01-30 09:18:00

|

531人浏览过

|

来源于php中文网

原创

动态绑定发生在运行时JVM执行invokevirtual指令时,针对非静态、非final、非私有的实例方法,根据对象实际类型查vtable调用对应实现。

详解java多态中的动态绑定过程

动态绑定发生在方法调用的哪个时刻

动态绑定(Dynamic Binding)不是在编译期决定的,而是在运行时、当 JVM 执行到 invokevirtual 字节码指令时才真正发生。它只对 publicprotected 和包访问权限的**非静态、非 final、非私有**实例方法生效。静态方法、私有方法(private)、构造器、final 方法都走静态绑定——它们的调用目标在编译期就锁死了。

常见误解是“只要用了父类引用指向子类对象,就一定动态绑定”,其实不然:如果调用的是 static 方法,哪怕签名完全一样,JVM 也只看引用变量的**声明类型**,而不是实际类型。

  • obj.method() 中的 method 若为 static → 绑定到 obj 声明类型对应的类
  • obj.method() 中的 method 若为实例方法且满足条件 → 绑定到 obj 实际运行时类型(即 new 出来的那个类)

JVM 怎么找到该调用哪个版本的方法

JVM 为每个类维护一张虚方法表(vtable),表中按声明顺序存放所有可被重写(overridable)的实例方法的入口地址。子类的 vtable 会继承父类 vtable,并把被重写的方法项替换成自己的实现地址。

当执行 invokevirtual 指令时,JVM 做三件事:

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

  • 查操作数顶对象的实际类型(比如是 Child 类实例)
  • 取该类型的 vtable,定位到对应方法在表中的索引位置
  • 跳转到该索引处存储的内存地址执行

这个过程不涉及反射或字符串匹配,所以开销极小。但要注意:vtable 是类加载阶段生成的,因此新增子类不会影响已有类的 vtable 结构;而接口方法(invokeinterface)不使用 vtable,而是用更耗时的 ITABLE 查找,这是接口多态性能略低的原因之一。

为什么重载(overload)不参与动态绑定

重载是编译期行为,由编译器根据**参数数量、类型、顺序**以及**引用变量的声明类型**来决定调用哪个方法。它和运行时对象的实际类型无关。

智慧车行预约小程序
智慧车行预约小程序

智慧车行小程序,是一个专门为洗车/4S/车辆维修行业打造的小程序,前后端完整代码包括车行动态,养车常识,保养预约,维修预约,洗车美容预约,汽车检测预约等功能。采用腾讯提供的小程序云开发解决方案,无须服务器和域名预约管理:开始/截止时间/人数均可灵活设置,可以自定义客户预约填写的数据项预约凭证:支持线下到场后校验签到/核销/二维码自助签到等多种方式详尽的预约数据:支持预约名单数据导出Excel,打印

下载

例如:

class A { void m(Object o) { System.out.println("A:Object"); } }
class B extends A { void m(String s) { System.out.println("B:String"); } }
A a = new B();
a.m("hello"); // 编译报错!因为 a 的声明类型是 A,A 中没有 m(String)

上面代码根本无法通过编译。即使改成:

A a = new B();
a.m(new Object()); // 输出 "A:Object" —— 绑定依据是 a 的声明类型 A,不是 new B()

这就是重载与重写的关键分水岭:重载看“左边”(引用类型 + 参数字面量),重写看“右边”(堆中对象的真实 class)。

容易被忽略的陷阱:字段访问不触发动态绑定

Java 中只有**方法调用**支持动态绑定,字段(成员变量)访问永远是静态绑定。哪怕子类定义了同名字段,也只会根据引用变量的声明类型来决定访问哪一个。

class Parent { String name = "Parent"; }
class Child extends Parent { String name = "Child"; }
Parent p = new Child();
System.out.println(p.name); // 输出 "Parent",不是 "Child"

这常导致初学者误以为“多态也适用于属性”,结果在调试时发现字段值没变。解决办法只有一个:把字段封装成 getter 方法——只有方法才能享受动态绑定。

另一个隐性坑是:匿名内部类或 Lambda 表达式捕获外部变量时,若该变量是实例字段,背后实际访问的仍是声明类型的字段副本(尤其在继承链中混用时),务必用 this.xxx 或显式 getter 显化意图。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

15

2025.11.27

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

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

299

2023.08.03

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

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

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

589

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

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

精品课程

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

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53.3万人学习

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

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