11

Java的引用变量是如何存储的?那工作类似于 C 指针吗?

我所说的引用变量的意思是这段代码中的 myDog

Dog myDog = new Dog();

我了解C指针,如果是全局变量,它存储在堆中,如果是局部变量,它存储在堆栈中。我想知道java的工作方式相同。

4

6 回答 6

23

您需要了解一些较低级别的 Java 内存组织。在堆栈上,存储了指向堆的基元(int、double、boolean 等)和对象引用。

在任何物体内部都是如此。它要么直接包含对其他对象或原语的引用。对象在任何上下文中始终是引用,并且这些引用是按值传递的。

所以我们可能有:

[ STACK ]                          [ HEAP ] 
int a: 10;                     ->  MyWrapperObject@21f03b70====||
double b: 10.4;                |   ||     int someField: 11    ||
MyWrapperObject@21f03b70 ------|   ||     String@10112222  ---------- 
......                             ||==========================||    |
                                                                     |
                                                                     |
                                    String@10112222============||<----
                                    || ...                     ||
                                    || ...                     ||
                                    }}=========================||

请注意,在某些情况下(如通过 JVM 内部)使用的对象可能存储在非堆内存中。

于 2013-10-27T21:08:47.267 回答
3

所有对 s1、s2、ob1、obj2 和 obj3 的引用都将存储在Stack中。

对象数据将存储在堆中(例如,字符串可以存储在特殊的常量池中)。

在此处输入图像描述

于 2017-09-24T13:48:11.987 回答
2

通常,局部变量存储在堆栈中。实例变量存储在堆上。

于 2013-10-27T21:11:01.020 回答
1

Java 的工作方式相同。请注意,Java 中的任何变量都没有对象作为值。所有对象变量(和字段)都是对对象的引用。对象本身由 Java 虚拟机维护在某个地方(通常在堆上)。Java 具有自动垃圾收集功能,因此(与 C 不同)您无需担心释放对象。一旦对它的所有实时引用都超出范围,它最终会被垃圾收集器清除。

例如:

Dog myDog = new Dog();
someMethod(myDog);

传递给由 .someMethod引用的 dog 对象的引用myDog。方法返回后,someMethod可以看到对象内部可能发生的更改。myDog

于 2013-10-27T21:08:38.950 回答
0

它的工作原理类似。实际发生的情况是对象本身存储在堆中,而对对象的引用(就像 C 指针一样)存储在局部变量中。

于 2013-10-27T21:08:39.273 回答
0

它与 C 指针完全相同,几乎总是在堆栈上。在 C 中,当您说时,对象本身在堆上,new Dog();Dog * myDogP指针(4 或 8 个字节)不必在堆上,通常在堆栈上。

于 2013-10-27T21:09:05.293 回答