据我粗略的理解,原始类型变量直接存储值,并且引用存储对象的位置。当我们想访问某些对象时,我们只需要找到引用并获取存储在引用中的对象的地址。但是这些对象有存储地址的参考,谁存储了引用的地址?或者有一些特殊的方式来访问参考?用于存储参考地址的内存中是否有特定的地方?
回答
'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。
对于我的理解,一个“程序”(使事情变得更简单)从操作系统接收一系列内存,并认为它是完整的内存。所以与其他程序没有冲突,操作系统需要将这些“虚拟地址”映射到实际地址。因此,编译器可以使用它想要的任何地址,而不必关心它是否空闲,因为操作系统会给程序一个“完全空闲的内存”。
我希望我没有犯大错误,这是你真正的问题。
@deathlee:编辑完成后,这是你的问题吗? – user2089810
我不确定您的意思是“找到参考”。如果你没有对某个地方的对象的引用(即使在一些深层次的对象中),那么你就不会找到它,如果没有人引用它,这个对象将被垃圾收集。
你可以在一个方法里面有这个引用(比如你可以有类型如int
,short
等存储在那里),在这种情况下,它存储在stack
(它是可用于您的应用程序的内存的一部分,其中存储方法的局部变量)。
或者您可以将此引用存储在其他对象中,在这种情况下,此引用存储在heap
(也是应用程序可用的内存的一部分,使用new
创建的对象存储在那里)。
编辑:
如果你想知道这个对象是如何利用位于参照然后在Java中的细节是从开发人员隐藏的实现,所以你不关心如何发生的。在内部,对一个对象的引用可能包含这个对象在计算机内存中的地址(你不知道的地址)。如果您编写例如C++程序,那么您将能够看到您创建的对象的内存地址。
- 1. 用于存储的地方
- 2. C++ - 获取特定的内存地址
- 3. 确定存储过程是否存在于任何地方?
- 4. C函数是否保证有固定的内存地址?
- 5. C中的函数参数是否总是具有相同的内存地址?
- 6. 存储指针地址在malloced内存
- 7. Spring MVC - JSP - 用于存储环境特定常量的地方
- 8. 内存地址是否与缓存块中的数据分开?
- 9. 内存地址
- 10. 函数返回后本地内存地址是否有效?
- 11. 查找存储特定地址的所有指针
- 12. 获取byref参考字符串的内存地址
- 13. 储存库基地或特定方法?
- 14. Mongoid:IPv6地址存储
- 15. 如何删除本地存储器内存储的特定项目?里面存放的本地存储
- 16. 基于IP地址的Google存储访问地址
- 17. 是否有一个用于HTML5本地存储的phpMyAdmin?
- 18. 机器内存地址的内存地址? (C语言)
- 19. sqlite的IP地址存储
- 20. 用于存储PL/SQL块的地方
- 21. 在内存映射中给定虚拟地址的页码是否等于0?
- 22. 存储在堆内存中的成员数据的地址
- 23. 关于内存地址的观察点
- 24. 内存地址转换是否需要额外访问内存?
- 25. iOS是否有标准的输入和存储街道地址的方式?
- 26. memccpy返回内存地址低于src的起始地址
- 27. 是否有必要调用NSManagedObjectContext保存:用于内存存储?
- 28. 是否有可能在Windows中写入任何内存地址
- 29. C++内存地址?
- 30. CUDA:存储在全局内存中的地址
这是变量的值。 –