当前位置:编程学习 > JAVA >>

关于引用数据类型成员变量堆内存分配问题

我们知道非静态成员变量,随着new 出来的对象存放在堆内存中。如果该成员变量是已初始化的引用数据类型。那么该对象中的这个引用数据类型变量是存放地址,还是一个对象?
例子:
class Person{
    Heart myHeart = new Heart();

}
class Heart{
}
这个例子里,Person对象里面的变量myHeart,在堆内存中,那么myHeart在堆内存里只存放Heart对象的首地址,还是heart对象就是直接在Person这个对象所分配的空间里呢?
堆和栈是两个功能不同的内存空间,堆内存是靠GC来清理垃圾的,栈是自动释放。那么myHeart是在堆里,如果它存放的是地址,指向Heart对象,那么这个引用和对象岂不都要靠GC来清理?
感觉说的有点绕~菜鸟请理解。 成员变量 内存 jvm --------------------编程问答-------------------- myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象 --------------------编程问答-------------------- --------------------编程问答-------------------- gc判断对象是否有引用指向此对象,如果没有基本上这个对象就算垃圾对象,会被回收 --------------------编程问答--------------------
引用 1 楼 fudongrifdr 的回复:
myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

类成员变量不是随对象存在堆内存中吗??越来越糊涂了~~ --------------------编程问答--------------------
引用 3 楼 huxiweng 的回复:
gc判断对象是否有引用指向此对象,如果没有基本上这个对象就算垃圾对象,会被回收

如果该引用是在堆中,那么该引用不会自动释放,会一直指向此对象呢? --------------------编程问答-------------------- myHeart确实应该存在于堆内存,没注意 --------------------编程问答--------------------
引用 6 楼 fudongrifdr 的回复:
myHeart确实应该存在于堆内存,没注意

这个问题求解答 --------------------编程问答--------------------
引用 1 楼 fudongrifdr 的回复:
myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

栈中存放的是堆中对象的引用。
自动释放栈中的变量,之后堆中的对象就没有指向他的引用了,gc回收的时候会判断堆中的对象是否被引用了,如果没有被引用就会被gc掉,如果有引用此对象,就不会被gc --------------------编程问答--------------------
引用 8 楼 genganpeng 的回复:
Quote: 引用 1 楼 fudongrifdr 的回复:

myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

栈中存放的是堆中对象的引用。
自动释放栈中的变量,之后堆中的对象就没有指向他的引用了,gc回收的时候会判断堆中的对象是否被引用了,如果没有被引用就会被gc掉,如果有引用此对象,就不会被gc

这个myHeart变量不应该是随Person对象存放在堆中吗? --------------------编程问答--------------------
引用 9 楼 u012958906 的回复:
Quote: 引用 8 楼 genganpeng 的回复:

Quote: 引用 1 楼 fudongrifdr 的回复:

myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

栈中存放的是堆中对象的引用。
自动释放栈中的变量,之后堆中的对象就没有指向他的引用了,gc回收的时候会判断堆中的对象是否被引用了,如果没有被引用就会被gc掉,如果有引用此对象,就不会被gc

这个myHeart变量不应该是随Person对象存放在堆中吗?

初始化的时候分为两部分,先在堆中新建一个对象,然后再栈中引用它,myHeart就是存放在栈中的变量,对象是放在堆中的 --------------------编程问答--------------------
引用 10 楼 genganpeng 的回复:
Quote: 引用 9 楼 u012958906 的回复:

Quote: 引用 8 楼 genganpeng 的回复:

Quote: 引用 1 楼 fudongrifdr 的回复:

myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

栈中存放的是堆中对象的引用。
自动释放栈中的变量,之后堆中的对象就没有指向他的引用了,gc回收的时候会判断堆中的对象是否被引用了,如果没有被引用就会被gc掉,如果有引用此对象,就不会被gc

这个myHeart变量不应该是随Person对象存放在堆中吗?

初始化的时候分为两部分,先在堆中新建一个对象,然后再栈中引用它,myHeart就是存放在栈中的变量,对象是放在堆中的

myHeart应该是存放在堆内存中,它是成员变量,不是局部变量。 --------------------编程问答--------------------
引用 11 楼 u012958906 的回复:
Quote: 引用 10 楼 genganpeng 的回复:

Quote: 引用 9 楼 u012958906 的回复:

Quote: 引用 8 楼 genganpeng 的回复:

Quote: 引用 1 楼 fudongrifdr 的回复:

myHeart是引用类型的变量,存放在栈里,它指向堆中的Heart对象

栈中存放的是堆中对象的引用。
自动释放栈中的变量,之后堆中的对象就没有指向他的引用了,gc回收的时候会判断堆中的对象是否被引用了,如果没有被引用就会被gc掉,如果有引用此对象,就不会被gc

这个myHeart变量不应该是随Person对象存放在堆中吗?

初始化的时候分为两部分,先在堆中新建一个对象,然后再栈中引用它,myHeart就是存放在栈中的变量,对象是放在堆中的

myHeart应该是存放在堆内存中,它是成员变量,不是局部变量。

不管是成员变量还是局部变量都是一样的道理 --------------------编程问答-------------------- 楼主别绕了  楼上正解  初始化的时候分为两部分,先在堆中新建一个对象,然后再栈中引用它,myHeart就是存放在栈中的变量,对象是放在堆中的   不管是成员变量还是局部变量都是一样的道理 你要是是在理解不了就直接记住就可以了
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,