二、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和构造方法是前期绑定
原文链接
二、2.4运行时数据区 -- 动态链接 方法调用【静态绑定、动态绑定】
后期绑定我们可以类比C++中的虚函数[virtual关键字]

  • 子类对象的多态性的使用前提:

  • 非虚方法
    非虚方法,编译时就确定下来了,,所以无多态性
    二、2.4运行时数据区 -- 动态链接 方法调用【静态绑定、动态绑定】

  • 让Java拥有某些动态语言特性的指令invokedynamic
    二、2.4运行时数据区 -- 动态链接 方法调用【静态绑定、动态绑定】

动态类型语言(js python) 静态类型语言(C++、Java)
invokedynamic指令让java一定程度具备了一些动态类型语言的特性

相关文章:

  • 2021-08-24
  • 2021-08-08
  • 2021-06-08
  • 2021-08-27
  • 2022-12-23
  • 2022-12-23
  • 2021-06-18
  • 2022-12-23
猜你喜欢
  • 2021-10-26
  • 2021-07-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案