1.机制概述
当调用对象的方法时,该方法会和该对象的内存地址/运行绑定。
当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。
2.代码示例
package com.sdnu.dynamicbinding;
public class Test {
public static void main(String[] args) {
A a = new B();
System.out.println("==== 1 ====" + a.i);
System.out.println("==== 2 ====" + a.sum());
System.out.println("==== 3 ====" + a.sum1());
}
}
class A{
public int i = 10;
public int sum(){
return getI() + 10;
}
public int sum1(){
return i + 20;
}
public int getI(){
return i;
}
}
class B extends A{
public int i = 200;
public int sum(){
return getI() + 200;
}
// public int sum1(){
// return i + 20;
// }
public int getI(){
return i;
}
}
3.分析代码
- 分析 A a = new B();
这个a的编译类型是A,运行类型是B - 分析System.out.println(“==== 1 ====” + a.i);
这个i因为声明在A,所以是A的i
- 分析System.out.println(“==== 2 ====” + a.sum());
这个sum方法会和调用该方法的对象进行动态绑定,所以调用的是B中的方法。
- 分析 System.out.println(“==== 3 ====” + a.sum1());
这个sum1同样会去B中寻找sum1方法,但是因为B中没有sum1方法,所以会去B的父类中寻找sum1方法,即去A中寻找sum1方法。