原理:(1)、当调用方法时,方法会跟对象的运行类型绑定。
(2)、当调用属性时,没有对象绑定机制,哪里声明哪里使用。
package com.hb.poly_;
public class DynamicBinding {
public static void main(String[] args) {
A a=new B();
System.out.println(a.i);
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A{
public int i=10;
public int getI(){
return i;
}
public int sum(){
return getI()+10;
}
public int sum1(){
return i+10;
}
}
class B extends A{
public int i=20;
public int getI(){
return i;
}
public int sum(){
return i+20;
}
public int sum1(){
return i+10;
}
}
以上代码答案很简单,编译类型是A,属性与编译类型有关,运行类型是B,所以从B类开始查找方法。

如果我把B类的sum和sum1方法注释掉会答案会是怎么样呢?
package com.hb.poly_;
public class DynamicBinding {
public static void main(String[] args) {
A a=new B();
System.out.println(a.i);
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A{
public int i=10;
public int getI(){
return i;
}
public int sum(){
return getI()+10;
}
public int sum1(){
return i+10;
}
}
class B extends A{
public int i=20;
public int getI(){
return i;
}
/*public int sum(){
return i+20;
}
public int sum1(){
return i+10;
}*/
}
因为运行类型是B,所以根据继承机制,我们先从B类查找方法sum和sum1,但是都被注释掉了,所以查找父类A,父类A的sum方法内有函数getI(),A类和B类也都定义了这个函数,那么该调用哪个函数呢?sum1方法内有个i,是A类的i还是B类的i呢?
这就得用到java的动态绑定机制了,方法会与运行类型绑定,所以调用的是B类中的getI函数,属性则是没有动态绑定机制,哪里声明哪里使用,getI()返回20,sum()返回30,sum1()返回20。

本文通过一个Java代码示例,解释了动态绑定的概念。当子类对象调用方法时,即使方法在父类中定义,也会根据运行时的对象类型(即B类)来执行相应的方法。即使注释掉B类的sum和sum1方法,也会调用父类A中的实现,遵循方法的动态绑定机制。属性访问则遵循静态绑定,直接根据编译类型(A类)访问成员。因此,getI()返回20,sum()返回30,sum1()返回20。
632

被折叠的 条评论
为什么被折叠?



