字面量,符号引用,直接引用
1.字面量 百度的意思是在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。 我觉得意思就是自己定义的常量。就比如 int i = 0;0就是字面量。 2.符号引用:这里借用我找到的别人说的,我觉得描述的比较贴切。 符号引用以一组符号来描述所引用的目标, 符号可以是任何形式的字面量, 只要使用时能够无歧义的定位到目标即可. 例如, 在Java中, 一个Java类将会编译成一个class文件. 在编译时, Java类并不知道所引用的类的实际地址, 因此只能使用符号引用来代替. 比如org.simple.People类引用了org.simple.Language类, 在编译时People类并不知道Language类的实际内存地址, 因此只能使用符号org.simple.Language来表示Language类的地址. 符号引用,顾名思义,就是一个符号,符号引用被使用的时候,才会解析这个符号。如果熟悉linux或unix系统的,可以把这个符号引用看作一个文件的软链接,当使用这个软连接的时候,才会真正解析它,展开它找到实际的文件 对于符号引用,在类加载层面上讨论比较多,源码级别只是一个形式上的讨论。 当一个类被加载时,该类所用到的别的类的符号引用都会保存在常量池,实际代码执行的时候,首次遇到某个别的类时,JVM会对常量池的该类的符号引用展开,转为直接引用,这样下次再遇到同样的类型时,JVM就不再解析,而直接使用这个已经被解析过的直接引用。 除了上述的类加载过程的符号引用说法,对于源码级别来说,就是依照引用的解析过程来区别代码中某些数据属于符号引用还是直接引用,如,System.out.println(“test” + “abc”);//这里发生的效果相当于直接引用,而假设某个String s = “abc”; System.out.println(“test” + s);//这里的发生的效果相当于符号引用,即把s展开解析,也就相当于s是"abc"的一个符号链接,也就是说在编译的时候,class文件并没有直接展看s,而把这个s看作一个符号,在实际的代码执行时,才会展开这个s。(我个人观点这段举例只是为了方便理解,单JVM中实际的情况这个s并不算符号引用,只能算是实例,) 3.直接引用 对比着符号引用来看,就像String s = “abc”; System.out.println(“test” + s);这个s是直接引用,就是可以直接定位到类的指针直接指向目标的指针. 引用别人的话: (个人理解为: 指向方法区中类对象, 类变量和类方法的指针) 相对偏移量. (指向实例的变量, 方法的指针) 一个间接定位到对象的句柄.
