java中的动态绑定机制
本文主要讲述java中的动态绑定机制。
老韩ppt关于动态绑定机制:
示例代码如下:
public class DynamicBinding { public static void main(String[] args) { A a = new B(); // 编译时是A类,运行时是B类。 System.out.println(a.sum()); // 40 System.out.println(a.sum1()); // 30 } } 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 sum(){ return i + 20; } public int getI(){ return i ; } public int sum1(){ return i + 10; } }
运行结果:
若将B中的sum()和sum1()方法注释:
public class DynamicBinding { public static void main(String[] args) { A a = new B(); // 编译时是A类,运行时是B类。 System.out.println(a.sum()); // 30 System.out.println(a.sum1()); // 20 } } 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 sum(){ // return i + 20; // } public int getI(){ return i ; } // public int sum1(){ // return i + 10; // } }
运行结果如下:
原因:
A a = new B();
编译阶段,a是A类,运行阶段,a是B类。当B中的sum()方法和sum1()方法注释时,
a.sum(),首先在B类中查找sum()方法,发现没有,接着在B的父类A中继续查找sum()方法,但是在A类的sum()方法中有getI()方法,此时A类有getI()方法,与B中的getI()方法有重写关系,此时应该调用哪个getI()方法呢?应该调用B中getI()方法,返回B类的成员变量 i = 20。
a.sum1(),首先在B类中查找sum1()方法,发现没有,接着在B的父类A中继续查找sum()1方法,由于sum1()中运用属性i,根据就近原则,这里的i即为A中的成员变量 i = 10。
引入动态绑定机制的概念:
1.当调用对象方法时,该方法会与【运行类型】对象的内存地址绑定。
2.当调用属性时,没有动态绑定机制,哪里声明,哪里使用。