java动态绑定机制
1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
2. 当调用对象的属性的时候,没有动态绑定,哪里声明,哪里使用
//父类
class A{
public int i = 10;
public int sum() {
return getl() + 10;
}
public int sum1() {
return i + 10;
}
public int getI() {
return i;
}
}
//子类
class B extends A {
public int i = 20;
public int getI() {
return i;
}
}
//main方法
public class DynamicBinding {
public static void main(String[] args) {
A a = new B();//向上转型
Systerm.out.println(a.sum());
Systerm.out.println(a.sum1());
}
}
1. Systerm.out.println(a.sum);当这个代码执行时
A a = new B();等号左边是编译类型 等号右边是运行类型
a 的编译类型是 A ;运行类型是 B
首先在子类中B中寻找sum()方法,因为b中没有sum()方法,所以执行父类的sum()方法,父类sum()方法中的getI(),因为当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定,所以getI()执行的是A方法中的getI方法;
最后输出的结果是:30
2. Systerm.out.println(a.sum1()); 当执行这个代码时
因为a的运行类型是B,所以首先在子类中B中寻找sum1()方法,因为b中没有sum1()方法,所以执行父类的sum1()方法,因为当调用对象的属性的时候,没有动态绑定,哪里声明,哪里使用,所以sum1()方法中return i 的值就是父类B定义的i的值10;
最后输出的结果是:20