多态03 动态绑定机制
一、引入
主方法输出什么
A a = new B();
System.out.println(a.sum());
System.out.println(a.sum1());
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 = 10;
public int sum() {return i + 10;}
public int sum1() {return i + 10;}
public int getI() {return i;}
}
out:
40
30
如果把B类的sum方法注销,主方法又会输出什么?
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 = 10;
//public int sum() {return i + 10;}
public int sum1() {return i + 10;}
public int getI() {return i;}
}
a的编译类型A,运行类型B
a.sum() =>首先在运行类型B类中寻找sum方法,找不到,就去父类A中寻找,找到了 public int sum() {return getI() + 10;}
但是这里的getI(),会调用子类的还是父类的呢?
二、java的动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,那里使用
接上文,会调用B类中的getI() 方法
如果把B类的sum方法注销,主方法 a.sum1() 又会输出什么?
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 = 10;
//public int sum() {return i + 10;}
//public int sum1() {return i + 10;}
public int getI() {return i;}
}
a1.sum() =>
(1)首先a的运行类型是B,在B中寻找sum1方法,(用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定)。
(2)没找到,接着继承机制发挥作用,去父类A中寻找sum1方法,找到了。public int sum1() {return i + 10;}
(3)注意这里的 i 是属性,属性没有动态绑定机制,i 取的是A类中的 i 值。