讲师中心 微信公众号
AI工具推荐 视频效率加速

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

云浩大大_3101

云浩大大_3101

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

|

551人浏览过

|

来源于php中文网

原创

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

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

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

动态绑定(Dynamic Binding)不是在编译期决定的,而是在运行时、当 JVM 执行到 invokevirtual 字节码指令时才真正发生。它只对 public、protected 和包访问权限的**非静态、非 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)不参与动态绑定

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

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载

例如:

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工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

355

2025.11.27

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

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

1758

2023.08.03

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

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

2764

2023.09.04

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

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

6124

2023.10.24

字符串介绍
字符串介绍

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

5789

2023.11.24

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

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

7434

2024.03.22

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

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

10954

2024.04.29

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

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

5619

2025.07.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn