簡體   English   中英

JVM內存分配

[英]JVM Memory Allocation

嗨,我有一個關於繼承的問題。 在Java中,子類對象在其內部具有其超類的對象?

當JVM為子類對象分配空間時,是否為超類字段/方法分配空間? 謝謝。

例:

class Bar {
    public String field;

    public Bar() {
        this.field = "Bar";
    }
}

class Foo extends Bar {
    public String field;

    public Foo() {
        this.field = "Foo";
    }

    public void printFields() {
        System.out.println("Base: " + super.field);
        System.out.println("This: " + this.field);
    }
}

在執行時,將打印“ Bar”和“ Foo”。 Java在哪里分配空間以保持“字段”的兩個值?

是的,Java將為兩個對象引用分配空間-一個用於Foo.field ,另一個用於Bar.field 松散地說,這可以是一種可視化內存中Foo實例的方法:

[header] (references Foo.class, Bar.class, Object.class, among other details)
[Section for Bar]:
    Field, declared type String, referencing a `java.lang.String` with value "Bar"
[Section for Foo]:
    Field, declared type String, referencing a `java.lang.String` with value "Foo"

這些字段的偏移量是JVM已知的,並在讀取/寫入它們時使用。

請注意,這並不意味着Foo包含Bar ,而是FooBar等。

在Java中,子類對象內部具有其超類的對象。

否。子類不“包含”其父對象。 繼承是“是”關系。 Foo的實例是Bar的實例。 並不是說Foo包含Bar

當JVM為子類對象分配空間時,是否為超類字段/方法分配空間?

是。 盡管子類Foo具有相同名稱的字段(因此“遮蔽了”父級的字段),但是在內存中仍然分配了兩個字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM