我在java中有一个非常转储的问题。堆中每个java对象的内存分配将基于引用类或实例类?
public static void main(String[] a){
MemoryParent parChild = new MemoryChild();
}
在上面的例子中,对象parChild的内存分配是基于MemoryChild还是MemoryParent?我猜它基于实例类MemoryChild。有人可以澄清这个吗?
提前致谢。
答案 0 :(得分:7)
调用new
时会发生内存分配。因此,分配的内存大小为MemoryChild
。
这很好,因为MemoryParent
可能比MemoryChild
小得多。
答案 1 :(得分:2)
它基于它的类型,而不是它所引用的类型。在您的情况下,对象是 a MemoryChild
,因此使用该对象。
这样想:如果我称你为“新SO用户”,你仍然是“@Subbu”。仅仅因为我通过其他类型向您推荐并不会改变您的状态。
答案 2 :(得分:0)
它是MemoryChild类型,因此占用MemoryChild占用的空间,运行MemoryChild具有的方法等。
但是,在您编写的代码中,您只能将其视为MemoryParent,因此如果MemoryChild上有方法,您在MemoryParent中声明了 not ,则无法调用它们
所以基本上MemoryParent是静态或编译时parChild类型,而MemoryChild是动态或运行时类型parChild。
答案 3 :(得分:0)
MemoryParent parChild = new MemoryChild();
这意味着creating object of MemoryChild and Assigning to Reference of super class MemoryParent.
所以基于内存分配的实例类而不是它引用的类型。
要详细了解内存分配,请参阅this问题。