【问题标题】:What is the concept of handle in Java?Java中句柄的概念是什么?
【发布时间】:2017-04-17 13:48:44
【问题描述】:

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

Emp e = new Emp();

句柄存储在变量 e 中,它不是指针,即它不存储对象在内存中的地址。

解释给出了一个指针数组的例子。内存地址存储在 [1] 位置,当对象移动时,该位置会更新为新地址。

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

我花了很多时间来理解这一点,但仍然没有找到让我满意的答案。 因此,如果您能向我解释一下变量“e”中实际存储的内容(举个例子),那将会很有帮助。

谢谢:)

【问题讨论】:

    标签: java reference handle


    【解决方案1】:

    通常的术语是“对象引用”(或只是“引用”),而不是“句柄”。

    对象引用是一个不透明的值,它对 JVM 唯一标识某个对象。该值的形式不是由规范定义的。我怀疑它通常是intlong 的大小,但我认为JLSJVM 规范都没有涵盖这一点。 (为了让您了解一下,JVM 规范明确指出,即使 null [特殊值表示“无引用”] 的确切值也不是强制性的。)

    引用不是指针,当然,由于没有指定引用的形式,JVM 可以通过使用指针作为引用来实现,只要这个事实不能在违反规范的方式。

    因为引用不是指针,Java 没有像 C 及其相关语言那样的“指针运算”。

    因此,如果您能解释一下变量“e”中实际存储的内容(举例说明),那将会很有帮助。

    规范没有定义。它只是一个唯一标识对象的值(我们永远看不到该值;当您使用 System.out 打印未实现 toString 的对象时看到的十六进制值是对象的引用的神话只是那:一个神话)。 如何该值标识该对象取决于 JVM 的实现。它可能是一个指针。它可以是指针数组的索引。它可能更复杂,对不同的事物使用来自参考值的不同位。

    【讨论】:

    • 很好的解释伙伴。我终于明白了句柄的概念。继续指针数组示例,即“e”(引用变量)指向 a[1],而 a[1] 又(即 a[1])存储对象的地址。此外,我知道我们不能改变'e'的值,即我们不能让'e'指向a [5]或java中的任何其他内存,只有内容,即存储在a [1]的值可以改变.在 Java 中这是什么原因,即为什么不允许将“e”指向 Java 中的任何其他位置?允许它有哪些可能的风险?
    • @JayeshSaita:很高兴有帮助。 "...进一步我知道我们不能改变 'e' 的值..." 是的,我们可以:e = someOtherObject; 不要纠结于 JVM 是如何实现的它。只是:变量存储值。存储在引用类型变量中的值是对象引用。该值告诉 JVM 对象在哪里。 :-)
    【解决方案2】:

    句柄存储在变量 e 中,它不是指针,即它 不在内存中存储对象的地址。

    出于所有实际目的,您可以假设它将对象的地址存储在内存中。

    但是,考虑到在 Java 中您不能以显式方式管理内存。这意味着您不能使此类变量指向内存中的特定位置。你可以让这个变量指向一个特定的实例。

    【讨论】:

    • “为了所有实际目的......” - 除了压缩的 oops - stackoverflow.com/questions/25120546/…
    • 正确,在 64 位 JVM 的情况下
    • 我认为并非出于所有实际目的。 hashcode() 通常通过将对象引用转换为整数来实现(尽管这不是必需的),对吧?相反,如果它依赖于内存中的指针,那么每次 GC 对该实例的移动都会使其返回不同的哈希码,即使该对象没有发生变异。这违反了 hashcode() 的合同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2010-11-24
    • 1970-01-01
    • 2012-10-04
    • 2011-04-25
    相关资源
    最近更新 更多