向上转型时派生类数据成员的状态与内存占用问题
向上转型后对象的内存占用问题解答
咱们先把最核心的点掰明白:向上转型根本不会改变对象本身,它只是限制了「引用能访问到的成员范围」,对象在内存里的样子从创建那一刻起就固定了。
针对你的问题逐个拆解:
1. 父类引用指向的对象是否包含子类的500MB HashMap?
答案是肯定的。
你写的这段代码:
ChildClass childObject = new ChildClass(); ParentClass p = childObject;
这里的p只是一个类型为ParentClass的引用,但它指向的依然是完整的ChildClass实例——包括父类的所有成员,还有子类里的bigHashmap(以及它里面存的500MB数据)。
向上转型就像给一个装满东西的箱子套了个只能看到父类标签的外套,但箱子里的东西一点没少。你通过p没法直接访问bigHashmap(因为父类没有这个成员),但这个成员实实在在还在内存里,对象的总大小自然包含它的占用。
顺便提一句:你代码里的HashMap<int>不符合Java语法,泛型参数不能用基本类型,得写成HashMap<Integer, ...>哦。
2. 将p作为参数传递并保存为其他类的局部成员,内存占用会怎样?
Java里方法参数传递都是「值传递」,但对于对象引用来说,传递的是对象的内存地址值。
当你把p传给另一个类的构造函数,并且把它保存为该类的局部成员时:
- 并不会复制整个
ChildClass对象(包括那500MB的HashMap),只是多了一个指向同一个对象的引用变量。 - 新增的内存占用仅仅是这个引用变量本身的大小——在32位JVM里是4字节,64位JVM里通常是8字节(开启指针压缩的话也是4字节),和那500MB比起来可以忽略不计。
- 只要还有至少一个引用指向这个对象,它就不会被GC回收,内存占用始终是完整的
ChildClass对象大小。
内容的提问来源于stack exchange,提问作者bsobaid
相关产品推荐
相关产品推荐

