本文主要记录韩顺平老师讲解动态绑定机制过程中提到的重点,本文转载此篇博客【Java】动态绑定机制,并对其进行一定的补充,如有侵权会删除。
特点
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
public class DynamicBinding {
public static void main(String[] args) {
// a 的编译类型是 A ,运行类型是 B
//属性看编译类型是哪个,方法看运行类型是哪个。
A a = new B();
System.out.println(a.sum()); //40
System.out.println(a.sum1()); //30
}
}
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;
}
}
首先上述代码执行过后的结果是很容易看出的
40
30
演示1
把子类中的 sum()
方法注释掉,main
方法中的 a.sum()
输出什么?
public class DynamicBinding {
public static void main(String[] args) {
// a 的编译类型是 A ,运行类型是 B
A a = new B();
System.out.println(a.sum()); //30
System.out.println(a.sum1());
}
}
class A { //父类
public int i = 10;
//动态绑定机制:
public int sum(){
return getI() + 10;// 20 + 10
}
public int sum1(){
return i + 10;
}
public int getI(){//父类 getI()
return i;
}
}
class B extends A { //子类
public int i = 20;
public int getI(){// 子类 getI()
return i;
}
public int sum1(){
return i + 10;
}
}
此时输出的结果是
30
分析
-
这个时候
a
的运行类型是B
,a.sum()
就会先找子类中的sum()
方法,而此时子类中的sum()
方法被注销了,所以只能去父类找sum()
方法,sum
方法中再去调getI()
方法,而此时父类和子类都有getI()
方法。 -
因为
a.sum()
方法的运行类型B
,根据动态绑定机制,所以找到子类中的getI()
方法,而在getI()
中的return i
这个i
是属性,没有绑定机制,在子类中声明的,直接返回 20 ,然后回到父类中的sum()
方法 ,20 + 10
,所以最后a.sum
的输出值为30
。
演示2
把上面子类中的 sum1()
方法注释掉,main
方法中的 a.sum1()
输出什么?
public class DynamicBinding {
public static void main(String[] args) {
// a 的编译类型是 A ,运行类型是 B
A a = new B();
System.out.println(a.sum());//30
System.out.println(a.sum1());//20
}
}
class A { //父类
public int i = 10;
//动态绑定机制:
public int sum(){
return getI() + 10;//20 + 10
}
public int sum1(){
return i + 10;
}
public int getI(){//父类 getI()
return i;
}
}
class B extends A { //子类
public int i = 20;
public int getI(){// 子类 getI()
return i;
}
}
此时输出结果是
20
分析
a
的运行类型是 B
,所以从子类B
开始找,而此时 sum1
方法被注释了,只能去找父类A
中的 sum1
方法,在 sum1
方法中 return i + 10
,而 i
是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i
属性在父类A
中声明,所以 i
为10
,所以 a.sum1
的输出值为 20