Java的动态绑定机制

  • 当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
public class TestObject {

    public static void main(String[] args) {
        A a = new B();
        //当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
        //动态邦定机制和属性没有关系。
        System.out.println(a.getResult());
    }
}
class A {
    public int i = 10;

    public int getResult(){

        return i + 10;
    }
}
class B extends A{

    public int i = 20;

    public int getResult(){
        //这里i其实有两个值,一个是super.i = 10 ,另一个是this.i = 20,这里用的是this.i = 10。
        return i + 20;
    }
}

输出结果:40
画图分析内存图:

内存分析图

因为B继承了A,所以B中也有getResult()方法,当调用getResult()方法时,因为B和A中都有这个方法,那么到底应该调用哪个里面的getResult()呢?这个时候就用到了Java对象的动态绑定机制: 当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
因为B中有getResult()方法,所以调用的就是B中的方法,所以结果才是40。

  • 动态邦定机制和属性没有关系。
public class TestObject {

    public static void main(String[] args) {
        A a = new B();
        //当JVM执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定。
        //动态邦定机制和属性没有关系。
        System.out.println(a.getResult());
    }
}

class A {
    public int i = 10;

    public int getResult(){

        return i + 10;
    }
}

class B extends A{

    public int i = 20;

//    public int getResult(){
//
//        return i + 20;
//    }
}

输出结果:20
如上代码所示,当注释掉B中的getResult()方法后,因为B中没有getResult()方法,所以调用的就是A中的getResult()。又因为动态绑定机制和属性没有关系,所以A中相当于是“return this.i + 10”。

  • this代表的就是当前对象,只不过A中省略了,所以结果是20。


    内存图

你可能感兴趣的:(Java的动态绑定机制)