在我的粗略理解中,原始类型变量直接存储值,引用存储对象的位置。当我们想要访问某些对象时,我们只需要找到引用并获取存储在引用中的对象的地址。但是对象有引用存储其地址的参考,谁存储了引用的地址?或者有一些特殊的方法来访问参考?
答案 0 :(得分:1)
我不确定你的意思"找到参考"。如果你在某个地方没有引用该对象(甚至在某些深层次的对象内部),那么你将无法找到它,如果没有人引用它,这个对象将被垃圾收集。
您可以在方法中包含此引用(例如,您可以在其中存储int
,short
等类型),在这种情况下,它存储在stack
中(它是应用程序可用的一部分内存,其中存储方法的局部变量。)
或者您可以将此引用存储在其他对象中,在这种情况下,此引用存储在heap
中(也是应用程序可用的内存的一部分,使用new
创建的对象存储在那里)。
编辑:
如果你想知道这个对象是如何使用引用的,那么在Java中,这些实现细节对开发人员是隐藏的,所以你不关心这是如何发生的。在内部,对象的引用可能包含此对象在计算机内存中的地址(您不知道的地址)。如果你编写一个C ++程序,那么你将能够看到你创建的对象的内存地址。
答案 1 :(得分:0)
' int a;'变量' a'的内容被解释为整数
'对象a;'变量' a'的内容被解释为对象的地址
也许这会有助于进一步:https://softwareengineering.stackexchange.com/questions/65281/stack-and-heap-memory-in-java
修改强>
嗯...也许你的问题是:"程序如何知道变量' a' (引用一个对象)位于?引用变量的引用在哪里?"
嗯,这是一个非常好的问题。我不知道我说的话是完全正确的,但是我们走了。
程序必须自己在堆栈中分配内存。因此,在编译时,它已经定义了它将使用的地址。例如:
int a; a = 5;
让我们来代表选择放置的地址' a'作为' $ AAA' (这只是让事情变得简单的表现)。这将编译为:
将5放入地址$ AAA
请参阅?已编译的代码已经知道' a'位于:地址$ AAA。无论何时在代码中使用或设置变量A,编译代码中实际写入的内容都是在编译时选择的A的确切地址。
行。现在您可能会问编译器如何知道哪些地址可以免费使用?
所以我读了这个答案:Assembly memory allocation。
根据我的理解,一个"程序" (为了方便起见)从操作系统接收一系列内存,并认为它是完整的内存。因此,与其他程序没有冲突,操作系统需要映射这些虚拟地址"到真实的地址。因此,编译器可以使用它想要的任何地址,而无需关心它是否是免费的,因为操作系统将提供一个完整的空闲内存"该计划。
我希望我没有犯过大错,这是你真正的问题。