序言
对于Java程序来说,最重要的特性就是他的灵活,和可拓展性,在Java刚刚面世的时候,一次编写,处处运行无疑是最振奋和吸引程序员的,而在我们刚刚接触Java的时候,Java的重载,继承,多态性也让人好奇,如此灵活的使用方式到底是从何而来,实现这一切的基石之一就是本篇所讲的动态连接
我之前在虚拟机类加载机制(五)类解析的过程说过,其实对于Java程序来说,类的解析有时是不确定的,因为重载,继承等等动态语法只有在实际执行程序的时候才能确定具体调用的类,在此之前,Java无法得知具体的调用方法和类,自然也无法将符号转换为运行时的内存引用,所谓动态连接就是当确定具体的类或方法时,将符号动态解析为对应的内存地址的过程
这就要涉及到jvm虚拟机中的分派问题了
所谓分派,就是jvm虚拟机确定具体类或方法的过程,分为
- 静态分派
- 动态分派
- 单分派
- 多分派
我们先聊一聊静态分派
其实对于Java虚拟机来说,变量分两种,静态类型和实际类型,看下面这段代码
public static void main(String[] args) {
Runnable runnable=new Thread();
}
对于Java虚拟机来说,Runnable就是静态类型,无论里面实际填充的是什么,Runnable这个外壳是不会变的,对于Java虚拟机来说这是已经确定了的,但是实际类型是不一定的,可以是Thread,也可以是我们自己写的类,只有运行时才能确定
而静态分派,就是建立在静态类型的基础上的,静态分派便是根据这一层壳来确定究竟要使用哪一个方法,由于在编译之前,其实壳类型已经确定了,即使采用强转等操作,对于虚拟机来说只不过是换了一层壳,壳本身依然是确定的
由此就解决了类似于下面这段代码的问题
public static void main(String[] args<