java 基础知识巩固
java 动态绑定机制
java的动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
public class Main {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 getI() + 10;}public int sum1(){return i + 10;}public int getI(){return i;}
}class B extends A {public int i= 20;public int sum() {return i+ 20;}public int getI() {return i;}public int sum1(){return i+ 10;}
}
这里我们需要注意的是如果如上代码不做任何修改的话,打印的结果是:
40
30
现在我们对代码进行一定的修改然后再次查看打印结果
public class Main {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 getI() + 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;}public int sum1(){return i+ 10;}
}
打印结果是
30
30
这个结果猛一看上去可能会有点晕,不太符合我们的预期,其实造成这样的显现是因为java的动态绑定机制。
修改代码以后运行类型虽然是B但是B中没有了SUM()
方法,所以我们会向上查找父类的方法,在父类中找到了SUM()
所以我们会运行父类中的SUM()
方法,但是父类中的SUM()
方法调用了一个getI()
这里就容易把人搞晕了,因为这里父类和子类都有getI()
这个方法,具体调用哪一个呢?
以为有java的动态绑定机制,所以会运行B类中的getI()
方法,也就最终导致了运行结果为30