二、2.4运行时数据区 – 动态链接 方法调用【静态绑定、动态绑定】
学习渠道:尚硅谷
动态链接 方法调用【静态绑定、动态绑定】
1.栈顶缓存技术ToS
将栈顶元素全部缓存至物理CPU的寄存器中,以降低对内存的读/写次数,提高执行引擎模块的执行效率
2.动态链接及其作用
-
触发类主动加载 + 类中符号解析[JVM可以选择提前,也可以选择在符号即将被使用时再完成链接]
Java中模块的加载可能是由符号链接触发的,也可能是因为需要创建类实例导致的。另外还有一种情况,那就是由动态加载机制(其实我觉得用主动加载更能表达目的)触发的,即在运行时由程序决定加载和链接什么符号(以动态链接为基础)。这种能力让语言具备了获取在编译时尚未存在的模块和符号,以支持程序的动态扩展和实现插件机制。
链接 - 作用
将符号引用(变量、方法引用)转换为调用方法的直接引用 - 符号引用
符号#xx–》运行时常量池中找到 --》然后展开成引用类型的树 --》获取methodref(方法的引用地址)–》引用地址中包含着方法的地址 --》具体的方法 - 直接引用
当第一次触发符号引用的时候,那么就将方法真正的地址存放进methodref的*method中,下一次就不要在寻找, 之后就是直接引用了,不需要再去遍历找一趟了
方法调用
绑定:一个字段、方法或者类 的符号引用被替换为直接引用的过程[只发生一次]
早期绑定[编译期可“感知”,运行期保持不变] – 重载
- 早期绑定的方法时符号引用—>直接引用,,该过程称为==“静态链接”==
晚期绑定[编译期不可“感知”,运行期根据实际的类型绑定相应的方法] – 重写(多态特性)
- 晚期绑定的方法时符号引用—>直接引用,,该过程称为==“动态链接”==
Demo
注意:Java中除了static和final方法(private方法属于final方法,因为类中的private方法被隐式指定为final方法,由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭java中的动态绑定)之外,其他方法都是后期绑定。这意味着通常不必判定是否该进行后期绑定,因为它是自动发生的。
原文链接
java当中的方法只有final,static,private和构造方法是前期绑定
原文链接
后期绑定我们可以类比C++中的虚函数[virtual关键字]
-
子类对象的多态性的使用前提:
-
非虚方法
非虚方法,编译时就确定下来了,,所以无多态性 -
让Java拥有某些动态语言特性的指令invokedynamic
动态类型语言(js python) 静态类型语言(C++、Java)
invokedynamic指令让java一定程度具备了一些动态类型语言的特性