本文主要讲述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.当调用属性时,没有动态绑定机制,哪里声明,哪里使用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98983.html