[英]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.