类加载连接的解析步骤中符号引用替换为直接引用是什么意思

        首先看图,当一个Java类被编译成Class之后,假如这个类称为A,并且A中引用了B,那么在编译阶段A是不知道B有没有被编译的,而且此时B也一定没有被加载,所以A 肯定不知道B的实际地址,那么此时在A的class文件中,将使用一个字符串S来代表B的地址,S就被称为符号引用,在运行时,如果A发生了类加载到了解析阶段会发现B还未被加载,那么将会触发B的类加载,将B加载到虚拟机中,此时A中B的符号引用将会被替换为B的实际地址,这被称为直接引用。这样也能真正的调用B了。

        但是事情没有这么简单,了解多态的同学应该知道Java通过后期绑定的方式来实现多态,那么后期绑定这个概念又是如何实现的呢,其实就是这里的动态解析。接着上面所说,如果A调用的B是一个具体的实现类那么就称为静态解析,因为解析的目标类型很明确,而假如上层Java代码使用了多态,这里B]是一个抽象类或者是接口,那么B可能有两个具体的实现类C和D,此时B的具体实现并不明确,当然也就不知道使用那个具体类的直接引用来进行替换,既然不知道那就等一等吧,直到在运行过程中发生了调用,此时虚拟机调用栈中将会得到具体的类信息,这时候再进行解析,就能用明确的直接引用,来替换符号引用,这也就解释了为什么解析阶段有时候会发生在初始化阶段之后,这就是动态解析,用它来实现后期绑定。

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值