[英]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
,而是Foo
是Bar
等。
在Java中,子类对象内部具有其超类的对象。
否。子类不“包含”其父对象。 继承是“是”关系。 Foo
的实例是Bar
的实例。 并不是说Foo
包含Bar
。
当JVM为子类对象分配空间时,是否为超类字段/方法分配空间?
是。 尽管子类Foo
具有相同名称的字段(因此“遮蔽了”父级的字段),但是在内存中仍然分配了两个字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.