在Java里方法调用是如何绑定的_Java静态与动态绑定解析
发布时间 - 2026-01-24 00:00:00 点击率:次静态绑定在编译期确定调用目标,基于声明类型,适用于static、private、构造器和final方法;动态绑定在运行时根据实际类型选择方法,仅适用于非static、非private、非final的重写实例方法。
静态绑定发生在编译期,只看声明类型
Java 中的 static 方法、private 方法、构造方法和 final 方法,全部在编译时就确定了调用目标——也就是“绑”在了变量的**声明类型**上,跟实际运行时对象是谁无关。
常见错误现象:Parent p = new Child(); p.staticMethod(); 看起来像多态,但其实调用的是 Parent.staticMethod(),哪怕 Child 里重写了同签名的 static 方法,也不会被触发。
- 静态绑定不依赖对象实例,甚至可以写成
Parent.staticMethod()(推荐写法) -
private方法隐式final,子类里同名方法只是新定义,不是重写 - 如果父类声明类型没有某个
public实例方法,即使子类有,p.method()也会编译报错
动态绑定依赖运行时的实际类型
只有满足「非静态、非私有、非 final」的实例方法,才会走动态绑定。JVM 在运行时根据对象的 实际类型(即 new 出来的那个类),查该类的方法表(vtable),找到最终执行的方法版本。
典型场景:Animal a = new Dog(); a.speak(); 调用的是 Dog.speak(),不是 Animal.speak()。
- 动态绑定的前提是:方法在父类中已存在(至少是声明过),且子类做了重写(
@Override) - 子类新增而父类没有的方法,无法通过父类引用调用,编译直接失败
- 字段(
field)不参与动态绑定,a.name永远取Animal类里的name,哪怕Dog也定义了同名字段
从字节码看绑定差异
编译后,静态绑定的方法调用指令是 invokestatic,动态绑定的是 invokevirtual。你可以用 javap -c 查看:
public class Test {
static void s() {}
void v() {}
public static void main(String[] args) {
Test t = new Test();
t.s(); // → invokestatic
t.v(); // → invokevirtual
}
}
关键点在于:invokevirtual 指令本身不指定具体实现类,它靠栈顶对象的实际类型 + 方法签名去查表;而 invokestatic 直接锁定类和方法符号。
-
invokespecial用于构造器、private和super.xxx(),也是静态绑定语义 -
invokeinterface表面像动态,但本质仍是运行时查表,只是接口方法表结构不同
容易被忽略的陷阱:重载 vs 重写
重载(overload)是静态绑定,重写(override)才是动态绑定。很多人误以为“参数不同就自动多态”,其实不然。
例如:
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 里没有 m(String)
这里 B.m(String) 是对 A 的重载,不是重写,所以父类引用看不到它。
- 重载解析完全在编译期完成,依据是:变量声明类型 + 实参的编译期类型
- 重写必须方法签名(含返回类型协变)完全一致,且访问权限不能更严格
- 泛型擦除后,
List和List的方法签名一样,无法构成重载

# java
# 字节
# 栈
# ai
# 编译错误
# speak
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈redis在项目中的应用
简历没回改:利用AI润色让你的文字更专业
百度浏览器如何管理插件 百度浏览器插件管理方法
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何在新浪SAE免费搭建个人博客?
Laravel如何实现数据库事务?(DB Facade示例)
高防服务器租用如何选择配置与防御等级?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
JS去除重复并统计数量的实现方法
linux top下的 minerd 木马清除方法
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何在七牛云存储上搭建网站并设置自定义域名?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Swift中循环语句中的转移语句 break 和 continue
Laravel如何实现一对一模型关联?(Eloquent示例)
使用C语言编写圣诞表白程序
如何在万网ECS上快速搭建专属网站?
BootStrap整体框架之基础布局组件
详解jQuery停止动画——stop()方法的使用
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
JavaScript如何实现继承_有哪些常用方法
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何自定义建站之星网站的导航菜单样式?
bing浏览器学术搜索入口_bing学术文献检索地址
高端建站如何打造兼具美学与转化的品牌官网?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何快速搭建高效简练网站?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Android 常见的图片加载框架详细介绍
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
利用vue写todolist单页应用
智能起名网站制作软件有哪些,制作logo的软件?
北京的网站制作公司有哪些,哪个视频网站最好?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何自定义错误页面(404, 500)?(代码示例)
湖南网站制作公司,湖南上善若水科技有限公司做什么的?

