gpt4 book ai didi

java - Java 继承是否会创建一个隐藏的父对象?

转载 作者:行者123 更新时间:2023-12-05 09:26:11 27 4
gpt4 key购买 nike

在多个解释中,都解释了继承时只创建一个对象。但是,在从父类(super class)继承期间,子类不继承其父类的私有(private)属性。

但是,当子类调用其父类的非静态 getter 方法时,它显然是从某个父对象而不是类中获取值。那么看起来当你创建一个子类对象时,也创建了一个存储那些私有(private)属性的父类(super class)对象。

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

最佳答案

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

当对象被实例化时,它包含所有公共(public)和私有(private)字段,但它们都只在其特定范围内可用。

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

class A {
private boolean attribute;
}

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

在这种情况下,inst 将是包含两个私有(private)字段的单个对象 - 一个只能在 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)

关于java - Java 继承是否会创建一个隐藏的父对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74104191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com