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动态绑定机制的主要内容,如果未能解决你的问题,请参考以下文章

分享WeX5的正确打开方式——绑定机制

java动态绑定机制

java动态绑定机制

java动态绑定机制

反射机制

Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)