符号引用和直接引用

288 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

前言 最近学到了JVM类加载阶段中的链接阶段中的解析中的引用变化,符号引用和直接引用之间的关系,总结一下两者的关系。

符号引用

符号引用,顾名思义,就是一个符号,符号引用被使用的时候,才会解析这个符号。如果熟悉linuxunix系统的,可以把这个符号引用看作一个文件的软链接,当使用这个软连接的时候,才会真正解析它,展开它找到实际的文件。 对于符号引用,在类加载层面上讨论比较多,源码级别只是一个形式上的讨论。

直接引用

当一个类被加载时,该类所用到的别的类的符号引用都会保存在常量池,实际代码执行的时候,首次遇到某个别的类时,JVM会对常量池的该类的符号引用展开,转为直接引用,这样下次再遇到同样的类型时,JVM 就不再解析,而直接使用这个已经被解析过的直接引用。

除了上述的类加载过程的符号引用说法,对于源码级别来说,就是依照引用的解析过程来区别代码中某些数据属于符号引用还是直接引用,如,System.out.print("啊实打实的" + "撒大苏打"); 这里发生的效果相当于直接引用,而假设某个String t = "撒大苏打"; System.out.println("啊实打实的" + t);这里的发生的效果相当于符号引用,即把 s 展开解析,也就相当于s是 "abc" 的一个符号链接,也就是说在编译的时候,class文件并没有直接展看s,而把这个s看作一个符号,在实际的代码执行时,才会展开这个。

转化阶段

也就是在JVM类的解析阶段,才真正的把符号引用也就是一个软连接真正转换成直接引用。

image.png