今天在51CTO看到一篇很好的介绍Java动态绑定的文章。先转载部分过来给大家看看(地址:http://zhangjunhd.blog.51cto.com/113473/49452),共同学习,不过最后我想说的是虚拟机的实现。
运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。
1.Java的方法调用过程
-
编译器查看对象的声明类型和方法名(对象变量的声明类型)。通过声明类型找到方法列表。
-
编译器查看调用方法时提供的参数类型。
-
如果方法是private、static、final或者构造器,编译器就可以确定调用那个方法。这是静态绑定。
-
如果不是上述情况,就要使用运行时(动态)绑定。在程序运行时,采用动态绑定意味着:虚拟机将调用对象实际类型所限定的方法。
2.运行时(动态)绑定的过程
-
虚拟机提取对象的实际类型的方法表;
-
虚拟机搜索方法签名;
-
调用方法。
注意,这里说的是对象的实际类型。即在多态的情况下,虚拟机可以找到所运行对象的真正类型。
3.在向上转型情况下的动态绑定示例
public class Father {
public void method() {
System.out.println("父类方法,对象类型:" + this.getClass());
}
}
|
public class Son extends Father {
public static void main(String[] args) {
Father sample = new Son();//向上转型
sample.method();
}
}
|
结果1:
父类方法,对象类型:class samples.Son
这个结果没有疑问,声明的是父类的引用(句柄),但准确的调用了子类的对象,调用method,在子类中没有该方法,所以去父类中寻找到并调用之。
现在修改子类,重写(override)method方法。
public class Son extends Father {
public void method() {
System.out.println("子类方法,对象类型:" + this.getClass());
}
public static void main(String[] args) {
Father sample = new Son();//向上转型
sample.method();
}
}
|
结果2:
子类方法,对象类型:class samples.Son
这个结果也是意料之中的。调用method时,在子类中寻找到了该方法,所以直接调用之。
4.静态绑定成员变量
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性还是父类的属性。
现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。
public class Father {
protected String name="父亲属性";
public void method() {
System.out.println("父类方法,对象类型:" + this.getClass());
}
}
|
public class Son extends Father {
protected String name="儿子属性";
public void method() {
System.out.println("子类方法,对象类型:" + this.getClass());
}
public static void main(String[] args) {
Father sample = new Son();//向上转型
System.out.println("调用的成员:"+sample.name);
}
}
|
结果3:
调用的成员:父亲属性
这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。
上面这个文章教会我们几点,其中有一点很重要:运行时(动态)绑定针对的范畴只是对象的方法。他在第二点说:虚拟机可以找到所运行对象的真正类型。虚拟机是怎么找到的呢?实际上这跟对象存储结构有直接关系。对象引用指向的是堆中的对象,但是有如下几个理由要求虚拟机必须能够通过对象引用得到类数据:
当程序在运行时需要转换某个对象引用为另一种类型时,虚拟机必须要检查这种转换是否被允许,被转载的对象是否的确是被引用的对象或者它的超类型。当程序在执行instanceof操作时,虚拟机也进行了同样的检查。在这两种情况下,虚拟机都需要查看被引用的对象的类数据。最后,当程序中调用某个实例方法时,虚拟机必须进行动态绑定,换句话说,它不能按照引用的类型来决定将要调用的方法,而必须根据对象的实际类。为此,虚拟机必须再次通过对象的引用去访问类数据。
对象存储结构在另一篇文章有详细说明,我再举出其中一种的堆设计就可以说明问题,不管堆设计如何,引用对象总能够通过对象能找到类数据这是肯定的。
由上图就可以知道,对象引用通过某种联系查找方法区中的方法表,然后通过对象的实际类来决定所调用的方法。
分享到:
相关推荐
2. 面向对象:Java支持类、接口和继承,虽然仅支持单继承,但接口可以多继承,同时支持动态绑定。 3. 安全性:Java通过严格的类型检查和安全管理来提高代码的可靠性,避免了某些类型的错误和恶意操作。 4. 可移植性...
Java动态绑定和内联是Java编程中的两个关键概念,它们对于理解Java的面向对象特性,尤其是多态性和性能优化有着重要的作用。 动态绑定,又称晚期绑定或运行时绑定,是Java语言的一个核心特性。它指的是在运行时而非...
在Java中,动态绑定的过程是:虚拟机提取对象实际类型的方法表,虚拟机搜索方法签名,调用方法。 在Java中,子类和父类存在同一个方法时,子类重写了父类的方法,程序在运行时调用的是父类的方法还是子类的重写方法...
Java虚拟机规范是一套详细描述Java虚拟机(JVM)结构...总之,Java 11虚拟机规范是理解和实现Java虚拟机以及编写可以在JVM上运行的Java程序的基础文档。它不仅仅是一份技术说明,更是Java平台稳定性和可移植性的保证。
3. invokedynamic指令:这是Java 7引入的一个新字节码指令,用于动态语言支持,允许在运行时动态绑定方法调用,提高了脚本语言的性能。 4. 并发与多线程:Java SE 7提供了新的并发工具,如Fork/Join框架,用于解决...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境,使得代码能在任何支持Java的平台上无缝执行,实现了“一次编写,到处运行”的目标。《Java虚拟机规范(Java SE 8版)》是Oracle公司...
总的来说,Java的动态绑定机制通过对象内存模型中的方法表和运行时类型信息,实现了在运行时根据对象实际类型选择相应方法的调用。这种机制增强了Java的多态性,提高了代码的灵活性和可维护性,是Java语言设计的关键...
这意味着编译器并不知道具体调用哪个方法,而是由Java虚拟机(JVM)在运行时根据对象的实际类型动态地进行选择。这就是Java中的多态性基础,也是面向对象的一个核心特性。动态绑定的例子通常出现在子类重写父类方法...
静态绑定(也称为早期绑定或编译时绑定)和动态绑定(也称为晚期绑定或运行时绑定)是Java中多态性实现的基石。 **静态绑定**: 静态绑定在编译阶段就已经确定,它主要是针对`final`、`static`、`private`方法以及...
动态绑定(也称为后期绑定或运行时绑定)则是指在程序运行时,Java虚拟机(JVM)根据对象的实际类型决定调用哪个方法。动态绑定主要体现在多态性上,即子类对象可以被视为父类对象,调用父类引用的方法时,实际执行...
4. 方法调用优化:包括静态绑定、动态绑定、内联技术等,理解它们如何影响代码执行速度。 三、JVM热部署 1. JRebel:源码可能涉及到JRebel的使用,这是一种能够实现实时代码更改无需重启的工具,理解其工作原理能...
它使得方法可以在运行时动态地绑定到具体的目标方法。 ##### (二) 线程无关的组件 1. **堆(Heap)** - 堆是所有线程共享的内存区域,主要用于存储对象实例以及数组。 2. **内存管理(Memory Management)** - 内存...
在Java中,动态绑定是通过方法表来实现的。方法表是虚拟机为每个类创建的表,其中列出了所有的方法签名和实际调用的方法。这样,在调用方法时可以直接查表就可以了。例如,Person类的方法表可能是这样的:Person:...
Java虚拟机的动态绑定与静态绑定 大家可能都知道Java面向对象的三大特性,封装,继承,多态,其中动态绑定就与多态有关,那什么是动态绑定呢? 1.动态绑定(auto binding):也叫后期绑定,在运行时,虚拟机根据具体...
- 方法调用优化:涵盖静态绑定与动态绑定的区别,以及invokevirtual、invokespecial、invokestatic等指令的运用。 - JIT编译器:介绍即时编译器如何将热点代码转换为机器码,提升执行效率。 4. **运行时数据区** ...
Java是一种广泛使用的编程语言,具有跨平台的特性,这意味着编写的Java代码可以在任何支持Java虚拟机(JVM)的系统上运行。在这里,Java被用来作为调用大漠插件的接口,提供了一个与大漠插件交互的桥梁。通过Java,...
《MiniJavaVM——一个Java虚拟机的设计和实现》是一篇深度探讨Java虚拟机(JVM)实现原理的技术文章。在本文中,作者分享了构建一个微型版Java虚拟机(MiniJavaVM)的过程,旨在帮助读者深入理解JVM的工作机制。这篇...
11. **反射与动态代理**:Java反射允许运行时获取类的信息并操作对象,动态代理则能在运行时创建具有指定接口的代理对象。 12. **JNI(Java Native Interface)**:允许Java代码调用C/C++原生代码,实现性能优化...
9. 动态性:Java虚拟机允许动态加载类、动态绑定方法,以及使用Java反射机制在运行时检查和修改类的行为,增强了语言的灵活性。 通过对《Java虚拟机规范(Java SE 7)》的深入学习,开发者不仅可以理解Java代码如何...