如何存储Java的引用变量?这是否与C指针类似?
我的意思是引用变量是此代码中的myDog
Dog myDog = new Dog();
我理解了C指针,它存储在堆中的全局变量,并且它存储在堆栈中的局部变量。我想知道java工作方式相同。
答案 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)
答案 3 :(得分:1)
Java的工作方式相同。请注意,Java中没有变量将对象作为值;所有对象变量(和字段)都是对象的引用。对象本身由Java虚拟机维护在某个地方(通常在堆上)。 Java具有自动垃圾收集功能,因此(与C不同)您无需担心释放对象。一旦所有对它的实时引用超出范围,它最终将被垃圾收集器扫除。
例如:
Dog myDog = new Dog();
someMethod(myDog);
传递给someMethod
对myDog
引用的狗对象的引用。方法返回后,someMethod
中将显示对myDog
内可能出现的对象的更改。
答案 4 :(得分:0)
它确实有效。实际发生的是对象本身存储在堆中,对象的引用(就像C指针一样)存储在局部变量中。
答案 5 :(得分:0)
它与C指针完全相同,几乎总是在堆栈上。在C中,当你说new Dog();
时,对象本身就在堆上,但Dog * myDogP
指针(4或8个字节)不需要在堆上并且通常在堆栈上。