[英]How does the Memory work when we use Polymorphism?
有一种类似的博客,但我从不同的角度感兴趣。
考虑这两个类
public class Parent {
int x;
public Parent(int x) {
this.x = x;
}
}
public class Child extends Parent {
int y;
public Child(int x, int y) {
super(x);
this.y = y;
}
}
在主要方法中
Parent obj = new Child(1, 2);
Child childObj = (Child) obj;
System.out.println(childObj.x + " " + childObj.y);
如果我们看一下,即使我们从根本无法存储y
的Parent
开始一切(如您所见,它只有x
字段),我们也可以取回我们的x
和y
。
当我们用Parent
创建一个Child
object 时,额外的变量y
go 在哪里(因为Parent
只能存储变量x
)?
据我所知,堆栈中有一个Parent
引用了堆中的Child
,它保存了x
, y
和调用new
的 class 。
你能验证、否认、扩展我的想法吗?
Java 只为引用类型提供多态性。 也就是说, Parent
类型的变量仅包含对位于其他位置的 object 的引用。 随着时间的推移,同一个引用可以引用不同的对象,这些对象可能具有不同的子类型和大小。
也就是说,当您执行Parent obj = new Child(1,2)
时,会创建一个Child
类型的 object,除了它声明的字段 ( y
) 之外,它还存储从其超类型 ( x
) 继承的字段。
稍后访问parent.x
时,JVM 读取引用,并找到对应的 object,然后继续读取其x
。 为了简化此过程,大多数 VM 将x
字段针对Parent
的所有子类型保留在同一位置,因此 VM 可以以相同的方式读取该字段,而与对象的实际类型无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.