zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2.由浅入深解析 SimpleDateFormat
    7.如何在Maven项目中引入自己的jar包
    6.Java英文缩写详解
    6.JXL操作Excel
    5.Apache POI使用详解
    4.Properties文件的加载和使用
    3.java.util.logging.Logger使用详解
    2.使用dom4j解析XML文件
    jdk、jre、spring、java ee、java se
    JVM架构
  • 原文地址:https://www.cnblogs.com/imhurley/p/3308406.html
Copyright © 2011-2022 走看看