Java重要特性:动态绑定机制
案例1(引入)
public class DynamicBinding {
public static void main(String[] args) {
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 getl() + 10;
}
public int sum1(){
return i + 10;
}
public int getl(){
return i;
}
}
class B extends A{
public int i = 20;
public int sum(){
return i + 20;
}
public int getl(){
return i;
}
public int sum1(){
return i + 10;
}
}
A a = new B();是向上转型,调用方法看运行类型
a.sum()和a.sum1()分别输出40和30,这一点毫无疑问
案例2(动态绑定机制-调用对象方法)
如果把上述子类中的sum()注释掉,结果会有什么不同?
public class DynamicBinding {
public static void main(String[] args) {
A a = new B();
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A {
public int i = 10;
public int sum(){
return getl() + 10;
}
public int sum1(){
return i + 10;
}
public int getl(){
return i;
}
}
class B extends A{
public int i = 20;
// public int sum(){
// return i + 20;
// }
public int getl(){
return i;
}
public int sum1(){
return i + 10;
}
}
这个时候a.sum()访问子类,发现子类中没有sum方法,再去访问父类,父类中有sum方法,调用的过程中getl()出现了分歧,父类和子类中都有getl(),该调用哪一个?
这里就体现出java的动态绑定机制
java的动态绑定机制
1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
所以该案例中的a.sum()和a.sum1()分别输出30和30
案例3(动态绑定机制-调用对象属性)
接着把子类中的sum1()注销
public class DynamicBinding {
public static void main(String[] args) {
A a = new B();
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A {
public int i = 10;
public int sum(){
return getl() + 10;
}
public int sum1(){
return i + 10;
}
public int getl(){
return i;
}
}
class B extends A{
public int i = 20;
// public int sum(){
// return i + 20;
// }
public int getl(){
return i;
}
// public int sum1(){
// return i + 10;
// }
}
根据案例2中对动态绑定机制的描述,很容易分析出
a.sum()和a.sum1()分别输出30和20