Java中句柄的概念是什么?
我在一个站点()上读到,当我们实例化一个类时Java中句柄的概念是什么?,java,reference,handle,Java,Reference,Handle,我在一个站点()上读到,当我们实例化一个类时 Emp e = new Emp(); 句柄存储在变量e中,变量e不是指针,即它不在内存中存储对象的地址 该说明给出了指针数组的示例。存储器地址存储在[1]位置,当对象移动时,该位置用新地址更新 那么,为什么使用这个数组而不是直接存储地址(它声明它有助于GC,但我不理解它)并在对象移动时更新它(存储在e中的地址) 我花了很多时间来理解这一点,但仍然没有找到一个让我满意的答案。 因此,如果你能解释变量‘e’中实际存储了什么(用一个例子),那将非常有用
Emp e = new Emp();
句柄存储在变量e中,变量e不是指针,即它不在内存中存储对象的地址
该说明给出了指针数组的示例。存储器地址存储在[1]位置,当对象移动时,该位置用新地址更新
那么,为什么使用这个数组而不是直接存储地址(它声明它有助于GC,但我不理解它)并在对象移动时更新它(存储在e中的地址)
我花了很多时间来理解这一点,但仍然没有找到一个让我满意的答案。
因此,如果你能解释变量‘e’中实际存储了什么(用一个例子),那将非常有用
谢谢:)通常的术语是“对象引用”(或只是“引用”),而不是“句柄”
对象引用是一个不透明的值,它唯一地向JVM标识某个对象。该值的形式不由规范定义,而由其他规范定义。我怀疑它通常是int
或long
的大小,但我认为甚至这也不在或规范的范围之内(为了让您了解一下,JVM规范明确指出,即使是null
[特殊值表示“无引用”]的确切值也不是强制要求的。)
引用不是指针,当然,由于没有指定引用的形式,JVM可以通过使用指针作为引用来实现,只要不能以违反规范的方式利用这一事实
因为引用不是指针,所以Java不像C及其相关语言那样有“指针算法”
因此,如果你能解释变量‘e’中实际存储了什么(用一个例子),那将非常有用
它不是由规范定义的。它只是一个唯一标识对象的值(我们永远看不到该值;当您使用System.out
打印未实现toString
的对象时,您看到的十六进制值只是一个神话:一个神话)。该值如何标识该对象取决于JVM的实现。它可能是一个指针。它可以是指针数组的索引。它可能会更复杂,使用不同的位作为不同的参考值
句柄存储在变量e中,变量e不是指针,即它
不在内存中存储对象的地址
实际上,您可以假定它将对象的地址存储在内存中
但是,在java中考虑不能以显式方式管理内存。这意味着您不能让这类变量指向内存中的特定位置。您可以让这些变量指向一个特定的实例。
“所有实际用途…”-除了压缩的oops-是的,在64位JVM的情况下,我认为不是所有实际用途。hashcode()通常通过将对象引用转换为整数来实现(尽管这不是必需的),对吗?如果它依赖于内存中的指针,那么该实例的每个GC移动都会使它返回不同的哈希代码,即使对象没有发生变化。这违反了hashcode()的约定。很好的解释。我终于明白了handle的概念。继续指针数组示例,即“e”(参考变量)指向[1],该[1]反过来(即[1])存储对象的地址。此外,我知道我们不能更改“e”的值,即我们不能使“e”指向[5]或java中的任何其他内存,只能更改内容,即存储在[1]中的值。Java中出现这种情况的原因是什么,即为什么不允许将“e”指向Java中的任何其他位置?允许这样做可能有什么风险?@JayeshSaita:很高兴这有帮助。“…我进一步了解到,我们不能更改'e'的值…”是的,我们可以:e=someOtherObject代码>不要关注JVM如何实现它。只是:变量存储值。存储在引用类型变量中的值是对象引用。该值告诉JVM对象所在的位置。:-)