java动态绑定机制
Posted 天赋不够努力来凑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java动态绑定机制相关的知识,希望对你有一定的参考价值。
原理:(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动态绑定机制的主要内容,如果未能解决你的问题,请参考以下文章
Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)