静态链接: 编译时即可确认要转换成哪个直接引用。
编译的时候由于能够确定变量的静态类型,所以编译时可知,也就是为什么叫做静态链接的原因。接下来解释下为什么能够确定变量的静态类型并且是怎么确定的。
首先明确一个点:静态类型和实际类型都是可以改变的。唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明)。
静态链接发生的阶段其实也可以分为:静态分派和解析阶段 解析阶段就是将编译期可以确定不会发生变化的符号引用转换为直接引用。 有以下这些:
这些叫做非虚方法也就是运行时不会发生变化,编译期即可确定
而静态分派则是更改变量的静态类型,但是也可以确定编译时期不会发生变化。
(静态分派和动态分派的区别在于:静态分派是根据静态类型来确定调用的方法是哪个,而动态分配时根据变量的实际类型。由此可以得出静态分派在编译时就可以确定,而动态分派需要运行时) 典型的栗子就是方法的参数是根据参数的静态类型来决定调用哪个方法,重载就是利用的这点实现的,而调用多态则是根据变量的实际类型来确定的, 比如方法的重写。
而且当找不到对应的静态类型的时候在还会默认对静态类型进行转换。
动态链接: 编译时不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。
动态链接是和变量的实际类型相关的,因为变量的实际类型不能够在编译时确定只能等到运行时才可以,比如某个条件成立就将这个变量转换为A,不成立转为B(前提这个条件的成立与否必须是运行时才可以确定的,不能够在编译时就能够确认比如if(true) ),这个条件的成立必须是运行时才可进行确定的不能够在编译的时候就知道其实际类型是什么。所以叫做动态链接运行时才可以确定。