美文网首页Java面试题
Java的动态绑定机制

Java的动态绑定机制

作者: ae601c79c4fc | 来源:发表于2019-07-23 13:52 被阅读0次
    • 当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的动态绑定机制

        本文链接:https://www.haomeiwen.com/subject/xwyglctx.html