Java面试题

Java的动态绑定机制

2019-07-23  本文已影响0人  Map_Reduce
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”。

上一篇 下一篇

猜你喜欢

热点阅读