Java的动态绑定机制
动态绑定机制
内容:
- 当调用对象方法时, 该方法会与该对象的内存地址/运行类型绑定
- 当调用对象属性时, 没有动态绑定机制, 哪里声明, 哪里使用, 也就是遵循就近原则
例子
我们先给出两个类, 类A作为父类, 类B作为A的子类, 两者的属性和方法完全一致
class A { // 父类
public int i = 10;
public int sum() {
return getI() + 10;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
class B extends A {
public int i = 20;
public int sum() {
return i + 20;
}
public int getI() {
return i;
}
public int sum1() {
return i + 10;
}
}
紧接着在main方法中如下
public static void main(String[] args) {
A a = new B();
System.out.println(a.sum());
System.out.println(a.sum1());
}
首先这就是一个经典的多态向上转型, 根据多态的规则, 方法看运行类型, 属性看编译类型
a的编译类型为A, 运行类型为B
所以这里可以知道第一个答案为40, 第二个答案为30
接下来是重点
1, 将B类中的方法sum()
删除, 那么a.sum()
返回什么?
这里我们再来分析一下, 首先调用a的sum
方法, 因为运行类型是B,所以在B中寻找, 发现没有, 于是寻找父类
发现父类中有sum()
public int sum() {
return getI() + 10;
}
但是问题就出现了, 父类的sum()
中含有的getI()
应该属于谁?
这里因为java的动态绑定机制, 我们才知道, 这里遇到了新的方法应该返回B中寻找, 发现有getI()
所以这里返回的应该是B类中的i
, 所以答案为30
2.将B类中的方法sum1()
删除, 那么a.sum1()
返回什么?
依旧按照上述分析方法, 这里会去A中寻找sum1()
方法
public int sum1() {
return i + 10;
}
这里仍然有相同的问题, 这里有一个i
, 应该属于谁?
根据开篇的第二条, 属性没有动态绑定机制, 所以遵循就近原则, 所以这里是A的i
答案是20
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)