java动态绑定的情况分析

java是面向对象的语言,java中多态的一种情况是动态绑定。所谓的动态绑定,分两种情况:当调用类方法的时候,java虚拟机会基于对象的引用类型来选择执行方法。当java调用一个实例方法的时候,他会根据对象的实际类型来决定哪个方法来执行。

  1、java的对象模型

java虚拟机规范里面并没有规定java对象在堆里面应该怎么去表示。对象的内部表示,也决定了java的内存回收和内存分配的设计,所以这些都是根据虚拟机的不同而不同。

//关于java对象的内存模型!!

java虚拟机规范并没有强制规定需要使用方法表,但是方法表的使用可以大大的加快java程序的执行效率。

  2、动态绑定的内部机制

方法表是一个数组,其中的元素是指向方法区的方法指针。方法表中的元素并不含有static描述的静态方法,要不会包含private修饰的私有方法,只是包含了指向需要动态绑定的实例方法的方法指针。一般情况下,方法表里面的顺序是这样的,超类的方法放在子类的方法之前,同一个类里面的方法根据他们在class文件里面的先后顺序排列。当然,也有例外的情况,当子类覆盖了超类的方法,那么指向超类中方法的方法指针会变成子类中的方法指针。也就是说,super.method指针实际指向的是child.method。

所以说,下面这个例子

package fresh.heli.test;

/**
 * Created with IntelliJ IDEA.
 * User: justzhl
 * Date: 13-9-8
 * Time: 下午3:37
 */

public class Main {
    public static void main(String[] args) {
        Base base = new Child();
        base.test();
    }
}

class Base {
    public void test() {
        System.out.println("Base-test");
    }

}


class Child extends Base {
    @Override
    public void test() {
        System.out.println("Child-test");
    }
}

  

 

 

当Base base = new Child()的时候,new child()产生的方法表中,test是指向了child里面的test方法指针的,当调用base.test()方法的时候,输出应该是

Child-test

posted @ 2013-09-08 15:53  I'm Hurley  阅读(468)  评论(0编辑  收藏  举报