Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中句柄的概念是什么?_Java_Reference_Handle - Fatal编程技术网

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对象所在的位置。:-)