java引用变量存储在哪里?

时间:2013-10-27 21:06:22

标签: java variables pointers memory reference

如何存储Java的引用变量?这是否与C指针类似?

我的意思是引用变量是此代码中的myDog

Dog myDog = new Dog();

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

6 个答案:

答案 0 :(得分:22)

您需要了解一些较低级别的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内部)对象的使用可能存储在非堆内存中。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

对s1,s2,ob1,obj2和obj3的所有引用都将存储在堆栈中。

对象数据将存储在中(例如,对于String,可以存储在特殊的常量池中)。

enter image description here

答案 3 :(得分:1)

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

例如:

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

传递给someMethodmyDog引用的狗对象的引用。方法返回后,someMethod中将显示对myDog内可能出现的对象的更改。

答案 4 :(得分:0)

它确实有效。实际发生的是对象本身存储在堆中,对象的引用(就像C指针一样)存储在局部变量中。

答案 5 :(得分:0)

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