2014-06-07 56 views
-2

据我粗略的理解,原始类型变量直接存储值,并且引用存储对象的位置。当我们想访问某些对象时,我们只需要找到引用并获取存储在引用中的对象的地址。但是这些对象有存储地址的参考,谁存储了引用的地址?或者有一些特殊的方式来访问参考?用于存储参考地址的内存中是否有特定的地方?

+2

这是变量的值。 –

回答

0

'int a;'变量'a'的内容被解释为整数

'Object 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

对于我的理解,一个“程序”(使事情变得更简单)从操作系统接收一系列内存,并认为它是完整的内存。所以与其他程序没有冲突,操作系统需要将这些“虚拟地址”映射到实际地址。因此,编译器可以使用它想要的任何地址,而不必关心它是否空闲,因为操作系统会给程序一个“完全空闲的内存”。

我希望我没有犯大错误,这是你真正的问题。

+0

@deathlee:编辑完成后,这是你的问题吗? – user2089810

1

我不确定您的意思是“找到参考”。如果你没有对某个地方的对象的引用(即使在一些深层次的对象中),那么你就不会找到它,如果没有人引用它,这个对象将被垃圾收集。

你可以在一个方法里面有这个引用(比如你可以有类型如intshort等存储在那里),在这种情况下,它存储在stack(它是可用于您的应用程序的内存的一部分,其中存储方法的局部变量)。

或者您可以将此引用存储在其他对象中,在这种情况下,此引用存储在heap(也是应用程序可用的内存的一部分,使用new创建的对象存储在那里)。

编辑:

如果你想知道这个对象是如何利用位于参照然后在Java中的细节是从开发人员隐藏的实现,所以你不关心如何发生的。在内部,对一个对象的引用可能包含这个对象在计算机内存中的地址(你不知道的地址)。如果您编写例如C++程序,那么您将能够看到您创建的对象的内存地址。

+0

但是通过什么方式我的程序可以识别堆中的引用? – deathlee

+0

@deathlee:你为什么需要? –

+0

因为在我的想象中,如果程序找不到引用的地址,它就无法找到对象的地址,也无法访问对象。我不知道我的理解是否正确。 – deathlee

相关问题