面试题18:什么是符号引用?什么是直接引用?

在解析阶段会有一个步骤,将运行时常量池当中二进制数据当中的符号引用转化为直接引用的过程。
【符号引用】
以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机的布局无关。为什么要有符号引用? 在编译的时候每个java类都会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,所以就用符号引用来代替,而在解析阶段就是为了把这个符号引用转化成为真正的地址的阶段。
【直接引用】
直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译出来的直接引用一般是不同的。如果有了直接引用,那么直接引用的目标一定被加载到了内存中。直接引用可以是:直接指向目标的指针 指向对象,类变量和类方法的指针
相对偏移量
指向实例的变量,方法的指针
一个间接定位到对象的句柄。
【示例】
创建一个Student.java类
执行javap -verbose Student.class
红框中就是我们上面陈述的符号引用。