java引用变量存储在哪里?

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具有自动垃圾收集function,因此(与C不同)您无需担心释放对象。 一旦所有对它的实时引用超出范围,它最终将被垃圾收集器扫除。

例如:

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

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

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

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

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

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

在此处输入图像描述