“在子类的实例化期间,超类的私有字段是否也在堆内存中占有一席之地?

时间:2019-07-11 19:13:59

标签: java oop inheritance memory

考虑一个超类A和一个派生类B,而A包含一个私有变量x。 B包含一个显式的super()调用作为其构造函数内的第一个参数,而B可能还有其他一些变量,例如yz。据我所知,私有字段没有继承。这是否意味着在执行时不会实例化私有字段:

B b = new b(); 

我的问题是:运行上述代码后,堆的外观如何?当然会有yz,但是在这种情况下x呢?

2 个答案:

答案 0 :(得分:0)

字段继承力和字段 visibility 是两个独立的概念,请勿混淆。

字段继承

在某种程度上(为了简化一点),类是制作对象的模板。因此,如果类A声明了两个字段f1f2,则实例化A会创建具有这两个字段的对象(并在堆上为其分配内存)。

子类也是用于制作对象的模板,但是此模板表示为对另一个类的添加。因此,如果类B声明了字段f3并扩展了A,则基本上是在说:“取A定义的所有字段,然后添加f3。因此,实例化B会导致对象包含三个字段f1f2f3

视野可见度

通过诸如privatepublic之类的访问修饰符表示的字段可见性是一种控制代码的哪个部分“看到”(或可以引用)某个字段的方法。 private修饰符意味着声明该字段的类之外的任何代码都不能引用该字段。但是,这并不意味着该字段停止存在。为了使躲猫猫变得平行,如果您和另一个人在一个房间中并且关闭了灯,则看不到另一个人,但是他们仍然在那里。

要强调概念是分开的这一点,请考虑在某些情况下您可以可以查看不是继承的字段(例如,因为它们是非私有的,但在一个不属于同一类层次结构的类中)。在某些情况下,您 看不到被继承的字段,例如超类中的私有字段。

答案 1 :(得分:-1)

在执行此操作时实例化在超类中定义的私有字段。
在这一点上,您操作子类的事实不会改变任何内容。该字段始终存在并且可以实例化,只是子类无法直接访问它。
如果超类的字段不可实例化,则Java继承将没有任何意义,因为子类将不一致,甚至无法使用,因为超类方法将不再起作用。

例如:

private int x;
A(){
  this.x = getIntValue();
}

int getX(){return x;}

B是子类:

B(int x){
  super(); // in the compiled code even if not in the source code
}

new B().getX()当然会返回在超类中实例化的x的值。