静、动态绑定和JVM机制的分析

来源:互联网 发布:7号外设淘宝店网址 编辑:程序博客网 时间:2024/06/06 02:56

 在Java中,绑定分为静态绑定和动态绑定,又称为前期绑定和后期绑定。一个程序的执行,要经过编译和执行(解释)两个步骤。

1. 什么是绑定?
 当子类和父类(接口和实现类)存在同一个方法时,子类重写父类(接口)方法时,程序在运行时调用的方法时,是调用父类(接口)的方法呢?还是调用子类的方法呢?我们将确定这种调用何种方法的操作称之为绑定。
 绑定又分为静态绑定和动态绑定。

2. 静态绑定
 所谓的静态绑定就是在程序执行前就已经被绑定了(也就是说在编译过程中就已经知道这个方法是哪个类中的方法)。静态绑定使用类信息完成的,重载的方法使用静态绑定来完成的。
 Java中只有private、static和final修饰的方法以及构造方法是静态绑定。
<1>private方法的特点是不能被继承,也就是不存在调用其子类的对象,只能调用对象自身,因此private方法和定义该方法的类绑定在一起。

<2>static方法又称类方法,类方法属于类文件。它不依赖对象而存在,在调用的时候就已经知道是哪个类的,所以是类方法是属于静态绑定。

<3>final方法:final方法可以被继承,但是不能被重写,所以也就是说final方法是属于静态绑定的,因为调用的方法是一样的。
 总结:如果一个方法不可被继承或者继承后不可被覆盖,那么这个方法就采用的静态绑定。

3. 动态绑定
 编译器在每次调用方法时都要进行搜索,时间开销相当大。因此虚拟机会预先为每个类创建一个方发表(method table),其中列出了所有方法的签名和实际调用的方法。
动态绑定过程:
 <1>虚拟机提取对象的实际类型的方法表。
 <2>虚拟机搜索方法签名,此时虚拟机已经知道应该调用哪种方法。(PS:方法的签名包括了:1.方法名 2.参数的数量和类型~~~~返回类型不是签名的一部分。)
 <3>虚拟机调用方法。

4. Java的编译和运行
编译过程:是将java源文件(后缀.java)编译成字节码文件(后缀.class),在这个过程中,java不和内存打交道,编译时期会进行语法的分析,如果语法不正确就会报错。
运行过程:是指JVM虚拟机装载字节码文件并进行解释执行。这个过程会和内存打交道,是真正进行内存分布,执行java程序。

5. Java字节码执行方式
 第一种:即时编译方式,解释器先将字节编译成机器码,然后再执行机器码。
 第二种:解释执行方式,解释器通过每次解释并执行一小段代码来完成java字节码程序的所有操作。

6. 动静态优化建议
 由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。所以在不影响整体设计,我们可以考虑将方法或者变量使用private,static或者final进行修饰。这边优化的内容就涉及到了内联的知识。

原创粉丝点击