考虑一个超类A和一个派生类B,而A包含一个私有变量x
。 B包含一个显式的super()调用作为其构造函数内的第一个参数,而B可能还有其他一些变量,例如y
和z
。据我所知,私有字段没有继承。这是否意味着在执行时不会实例化私有字段:
B b = new b();
我的问题是:运行上述代码后,堆的外观如何?当然会有y
和z
,但是在这种情况下x
呢?
答案 0 :(得分:0)
字段继承力和字段 visibility 是两个独立的概念,请勿混淆。
在某种程度上(为了简化一点),类是制作对象的模板。因此,如果类A
声明了两个字段f1
和f2
,则实例化A
会创建具有这两个字段的对象(并在堆上为其分配内存)。
子类也是用于制作对象的模板,但是此模板表示为对另一个类的添加。因此,如果类B
声明了字段f3
并扩展了A
,则基本上是在说:“取A
定义的所有字段,然后添加f3
。因此,实例化B
会导致对象包含三个字段f1
,f2
,f3
。
通过诸如private
和public
之类的访问修饰符表示的字段可见性是一种控制代码的哪个部分“看到”(或可以引用)某个字段的方法。 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的值。