Java继承会创建隐藏的父对象吗



在多种解释中,解释了在继承过程中只创建一个对象。但是,在从超类继承的过程中,子类不会继承其父类的私有属性。

然而,当一个子类调用其父类的非静态getter方法时,它显然是从某个父对象而不是类中获取值。然后,当您创建一个子类对象时,似乎还会创建一个存储这些私有属性的超类对象。

那么,继承的方法和属性本质上有两个副本吗?例如,如果一个超类对象a有一个子类对象B。那么在B内部同时有一个super.attribute和一个this.attribute,因为还创建了一个隐藏的a对象?那么构造函数如何知道属性之间的区别呢?例如,A有一个构造函数,它将公共属性设置为4。然后B调用该构造函数并将相同的属性设置为5。但是B也继承了这个属性,不是吗?那么它会被重置为4吗?还是super.attribute=4而this.attribute=5?因此,属性的值不是继承的,而是它的存在?

Java在创建任何类的新实例时总是只创建一个对象,而不管它扩展了多少其他类。

当对象被实例化时,它包含所有的公共和私有字段,但它们都只能在特定的范围内使用。

如果你需要更多地了解对象是如何存储在内存中的,这里有一个例子:

class A {
private boolean attribute;
}
class B extends A {
private boolean attribute;
}
B inst = new B();

在这种情况下,inst将是一个包含两个私有字段的单个对象,其中一个只能在a内部访问,另一个只在B内部访问。JVM不按字段的名称存储字段,字段只是内存的一部分,JVM单独处理它们。

如果您想了解更多关于类的内部表示,我强烈建议使用Java对象布局工具(https://github.com/openjdk/jol)或IntelliJ Idea的相关扩展(https://github.com/stokito/IdeaJol)。在这个例子中,它显示了结果类在内存中的样子:

Instance size 24 Losses total 10 Losses internal 3 Losses external 7
Offset  Size  Type     Class  Field
0       12                    (object header)
12      1     boolean  A      attribute    < private field of A
13      3                     (alignment/padding)
16      1     boolean  B      attribute    < private field of B
17      7                     (loss due to the next object)

最新更新