*****标题写的是介绍虚拟机栈中的动态链接,但是这里讲解的是动态链接和静态链接的区别*****
一.概述:
Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以指向常量池的引用作为参数
- 部分符号引用在类加载阶段(解析)的时候就转化为直接引用,这种转化为静态链接
- 部分符号引用在运行期间转化为直接引用,这种转化为动态链接
二.虚/非虚方法
1.非虚方法:
在类加载阶段(解析时期)才会将符号引用解析直接引用的方法被称之为非虚方法
- 静态方法、私有方法、实例构造器、父类方法,这些只需要在类加载阶段就会确定
- 解析调用一定是一个静态过程
- 编译器可知,运行期不可变
2.虚方法:
在运行期间将符号引用转化为直接引用的方法被称之为虚方法
三.分派
首先先了解两个概念静态类型和实际类型
public class Ocean {
public static void main(String[] args) {
Ocean river = new River();
}
}
class River extends Ocean{
}
Ocean river = new River();
静态类型:编译期间确定的类型(Ocean)
实际类型:运行期间确定的类型(River)
**********左为静态类型,右为实际类型
再了解一个概念宗量:方法的接受者(亦即方法的调用者)与方法的参数统称为方法的宗量