Java的引用变量是如何存储的?那工作类似于 C 指针吗?
我所说的引用变量的意思是这段代码中的 myDog
Dog myDog = new Dog();
我了解C指针,如果是全局变量,它存储在堆中,如果是局部变量,它存储在堆栈中。我想知道java的工作方式相同。
您需要了解一些较低级别的 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 内部)使用的对象可能存储在非堆内存中。
通常,局部变量存储在堆栈中。实例变量存储在堆上。
Java 的工作方式相同。请注意,Java 中的任何变量都没有对象作为值。所有对象变量(和字段)都是对对象的引用。对象本身由 Java 虚拟机维护在某个地方(通常在堆上)。Java 具有自动垃圾收集功能,因此(与 C 不同)您无需担心释放对象。一旦对它的所有实时引用都超出范围,它最终会被垃圾收集器清除。
例如:
Dog myDog = new Dog();
someMethod(myDog);
传递给由 .someMethod
引用的 dog 对象的引用myDog
。方法返回后,someMethod
可以看到对象内部可能发生的更改。myDog
它的工作原理类似。实际发生的情况是对象本身存储在堆中,而对对象的引用(就像 C 指针一样)存储在局部变量中。
它与 C 指针完全相同,几乎总是在堆栈上。在 C 中,当您说时,对象本身在堆上,new Dog();
但Dog * myDogP
指针(4 或 8 个字节)不必在堆上,通常在堆栈上。