Java中句柄的概念是什么?

Jay*_*ita 2 java reference handle

我在一个网站(http://www.rajeshpatkar.com/articles/javarefpnt/)上读到,当我们实例化一个类时,即

Emp e = new Emp();
Run Code Online (Sandbox Code Playgroud)

句柄存储在变量e中,该变量不是指针,即它不将对象的地址存储在存储器中.

该解释给出了指针数组的示例.存储器地址存储在[1]位置,当移动对象时,该位置用新地址更新.

那么为什么使用这个数组而不是直接存储地址(它表明它有助于GC,但我不理解它)并在移动对象时更新它(存储在e中的地址)?

我花了很多时间来理解这一点,但仍然没有找到满足我的答案.因此,如果你能解释一下实际存储在变量'e'中的内容(带有一个例子),它将会安静有用.

谢谢 :)

T.J*_*der 9

通常的术语是"对象引用"(或仅仅是"引用"),而不是"句柄".

对象引用是一个不透明的值,它唯一地标识JVM的某个对象.该值的形式不是由规范定义的.我怀疑它通常是一个int或者大小long,但我不认为即使这个也被JLSJVM规范所覆盖.(为了给你一个想法,JVM规范明确指出,即使null[特殊值意味着"无参考"] 的确切值也不是强制性的.)

引用不是指针,当然因为没有指定引用的形式,所以可以通过使用指针作为引用来实现JVM,只要该事实不能以违反的方式被利用.规范.

因为引用不是指针,所以Java没有像C这样的"指针算术"及其相关语言.

因此,如果你能解释一下实际存储在变量'e'中的内容(带有一个例子),它将会安静有用.

它不是由规范定义的.它只是一个唯一标识对象的值(我们永远看不到这个值;当你System.out用来打印一个没有实现的对象时,你看到的十六进制值toString是对象的引用就是这样一个神话).该值如何标识该对象取决于JVM的实现.它可能是一个指针.它可以是指针数组的索引.它可能更复杂,使用参考值中的不同位来表示不同的东西.

  • @JayeshSaita:很高兴有帮助.*"......我进一步了解到我们无法改变'e'的值......"*是的,我们可以:`e = someOtherObject;`不要了解JVM如何实现它.Just:Variables存储值.存储在引用类型变量中的值是对象引用.该值告诉JVM对象所在的位置.:-) (2认同)