JVM内存分配

6

你好,我有一个关于继承的问题。在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 在哪里分配空间来维护 "field" 的两个值?
2个回答

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,而是Foo是一个Bar及更多。

1
@JCoder,那个信息没有显示出来,但这是我写的一个例子来说明概念。 - nanofarad

1
在Java中,子类对象内部包含其超类的对象。 不是的。子类不包含其父对象。继承是一种“is-a”关系。Foo的实例是Bar的实例。不是Foo包含Bar。 当JVM为子类对象分配空间时,会为超类字段/方法分配空间吗? 是的。尽管子类Foo具有相同名称的字段(因此“遮蔽”了父级的字段),但仍然在内存中分配了两个字段。

谢谢 :) 同样送给您。我试图给您一个“+”投票,但我无法这么做。 - JCoder
1
私有字段和方法在超类上继承,它们只是不可访问的。无论子类是否可以访问它们,内存都被分配。 - codelark
@codelark 你说得对!谢谢。严格来说,private 字段是被分配但不会被继承的。 - M A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接