JVM内存分配

时间:2015-06-30 20:11:54

标签: java

您好我有关于继承的问题。在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分配空间以保留"字段"?

的两个值

2 个答案:

答案 0 :(得分:1)

是的,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等等。

答案 1 :(得分:1)

  

在Java中,子类对象里面有一个超类的对象。

没有。子类不包含"包含"它的父对象。继承是一个" is-a"关系。 Foo的实例是Bar的实例。并非Foo包含Bar

  

当JVM为子类对象分配空间时,为超类字段/方法分配空间?

是。虽然子类Foo有一个具有相同名称的字段(因此"阴影"父' s字段),但在内存中仍然分配了两个字段。