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

浙公网安备 33010602011771号