Java中句柄是什么概念?
What is the concept of handle in Java?
我在网站 (http://www.rajeshpatkar.com/articles/javarefpnt/) 上看到,当我们实例化一个 class 即
Emp e = new Emp();
句柄存储在变量e中,它不是指针,即它不存储对象在内存中的地址。
解释给出了一个指针数组的例子。内存地址存储在 [1] 位置,当对象移动时,该位置会更新为新地址。
那么为什么要用这个数组而不是直接存储地址(说是帮助GC,我没看懂),移动对象时更新(e中存储的地址)?
我花了很多时间来理解这一点,但仍然没有找到令我满意的答案。
因此,如果您能向我解释变量 'e' 中实际存储的内容(通过示例),那将非常有帮助。
谢谢:)
通常的术语是 "object reference"(或只是 "reference"),而不是 "handle."
对象引用是一个不透明的值,它为 JVM 唯一标识某个对象。该值的形式不是由规范定义的。我怀疑它通常是 int
或 long
的大小,但我认为即使 JLS or the JVM 规范也没有涵盖它。 (为了给你一个想法,JVM 规范明确指出即使 null
[特殊值意味着 "no reference"] 的确切值也不是强制性的。)
引用不是指针,当然由于没有指定引用的形式,JVM 可以通过使用指针作为引用来实现,只要这个事实不能被利用以违反规范的方式。
因为引用不是指针,Java 不像 C 及其相关语言那样具有 "pointer arithmetic"。
So if you can explain me what actually is stored in the variable 'e' (with an example) it would be quiet helpful.
规范中没有定义。它只是一个唯一标识对象的值(我们永远看不到该值;当您使用 System.out
打印未实现 toString
的对象时看到的十六进制值的神话是对象的引用只是:一个神话)。 如何 该值标识该对象取决于 JVM 的实现。它可能是一个指针。它可以是指针数组的索引。它可能更复杂,对不同的事物使用与参考值不同的位。
A handle is stored in the variable e, which is not a pointer i.e it
does not store the address of object in memory.
出于所有实际目的,您可以假设它在内存中存储了对象的地址。
但是,请考虑在 Java 中您无法以显式方式管理内存。这意味着你不能让这种变量指向内存中的特定位置。你可以让这个变量指向一个特定的实例。
我在网站 (http://www.rajeshpatkar.com/articles/javarefpnt/) 上看到,当我们实例化一个 class 即
Emp e = new Emp();
句柄存储在变量e中,它不是指针,即它不存储对象在内存中的地址。
解释给出了一个指针数组的例子。内存地址存储在 [1] 位置,当对象移动时,该位置会更新为新地址。
那么为什么要用这个数组而不是直接存储地址(说是帮助GC,我没看懂),移动对象时更新(e中存储的地址)?
我花了很多时间来理解这一点,但仍然没有找到令我满意的答案。 因此,如果您能向我解释变量 'e' 中实际存储的内容(通过示例),那将非常有帮助。
谢谢:)
通常的术语是 "object reference"(或只是 "reference"),而不是 "handle."
对象引用是一个不透明的值,它为 JVM 唯一标识某个对象。该值的形式不是由规范定义的。我怀疑它通常是 int
或 long
的大小,但我认为即使 JLS or the JVM 规范也没有涵盖它。 (为了给你一个想法,JVM 规范明确指出即使 null
[特殊值意味着 "no reference"] 的确切值也不是强制性的。)
引用不是指针,当然由于没有指定引用的形式,JVM 可以通过使用指针作为引用来实现,只要这个事实不能被利用以违反规范的方式。
因为引用不是指针,Java 不像 C 及其相关语言那样具有 "pointer arithmetic"。
So if you can explain me what actually is stored in the variable 'e' (with an example) it would be quiet helpful.
规范中没有定义。它只是一个唯一标识对象的值(我们永远看不到该值;当您使用 System.out
打印未实现 toString
的对象时看到的十六进制值的神话是对象的引用只是:一个神话)。 如何 该值标识该对象取决于 JVM 的实现。它可能是一个指针。它可以是指针数组的索引。它可能更复杂,对不同的事物使用与参考值不同的位。
A handle is stored in the variable e, which is not a pointer i.e it does not store the address of object in memory.
出于所有实际目的,您可以假设它在内存中存储了对象的地址。
但是,请考虑在 Java 中您无法以显式方式管理内存。这意味着你不能让这种变量指向内存中的特定位置。你可以让这个变量指向一个特定的实例。