这是面试问题。
子类继承private吗 字段?
我的回答是“不”,因为我们不能使用“正常的面向对象的方式”访问它们。但是采访者认为它们是继承的,因为我们可以间接或使用反射访问这些字段,并且它们仍然存在于对象中。
回来后,我在javadoc中找到了以下引用:
超类中的私人成员 一个 子类不继承私有 父类的成员。
你知道面试官观点的论据吗?
这是面试问题。
子类继承private吗 字段?
我的回答是“不”,因为我们不能使用“正常的面向对象的方式”访问它们。但是采访者认为它们是继承的,因为我们可以间接或使用反射访问这些字段,并且它们仍然存在于对象中。
回来后,我在javadoc中找到了以下引用:
超类中的私人成员 一个 子类不继承私有 父类的成员。
你知道面试官观点的论据吗?
当前回答
我相信,答案完全取决于所提出的问题。我的意思是,如果问题是
我们可以直接访问超类的私有字段吗 他们的子类?
那么答案是否定的,如果我们查看访问说明符的细节,就会提到,私有成员只能在类本身内访问。
但是,如果问题是
我们可以访问超类的私有字段吗 他们的子类?
这意味着,访问私有成员的操作并不重要。在这种情况下,我们可以在超类中创建public方法,你可以访问private成员。因此,在本例中,您创建了一个接口/桥接器来访问私有成员。
其他oop语言,如c++,有友元函数的概念,通过它我们可以访问其他类的私有成员。
其他回答
子类不继承父类的私有成员。但是,如果父类具有用于访问其私有字段的公共或受保护方法,则子类也可以使用这些方法
参考: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html: ~:文本=私人% 20成员在% 20 % % 20 20超类,由% % 20使用% 20 20 % 20子类。
这里的问题/答案中的大多数困惑都围绕着继承的定义。
显然,正如@DigitalRoss解释的那样,子类的OBJECT必须包含其父类的私有字段。正如他所说,无法访问私人会员并不意味着它不存在。
然而。这与类继承的概念不同。在java世界中,存在语义问题时,仲裁人是java语言规范(目前是第3版)。
正如JLS所述(https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):
已声明的类的成员 Private不被继承 该类的子类。只有成员 声明为受保护的类的 或public由子类继承 类以外的包中声明 声明类的语句。
这就解决了采访者提出的问题:“子类继承私有字段吗?”(我强调了一下)
答案是否定的。他们没有。子类的对象包含父类的私有字段。子类本身没有父类的私有字段的概念。
这是学究性质的语义学吗?是的。这是个有用的面试问题吗?可能不会。但是JLS为Java世界建立了定义,并且这样做(在本例中)是明确的。
编辑(删除了Bjarne Stroustrup的平行引用,由于java和c++之间的差异,这可能只会增加混淆。我将让我的答案取决于JLS:)
正如其他人所指出的那样:
https://docs.oracle.com/javase/specs/jls/se8/html/jls - 8. - html # jls - 8.2:
声明为private的类的成员不会被继承 该类的子类。只声明类的成员 Protected或public由包中声明的子类继承 除了声明类的那个。
答案无疑是否定的,没有任何“如果”和“但是”。这围绕着继承的定义。根据定义,继承是针对类的,不是针对对象的。对象是使用类定义创建的。继承只是添加到类定义中的另一个块。那么,类是否继承了父类的私有成员?没有
我相信,答案完全取决于所提出的问题。我的意思是,如果问题是
我们可以直接访问超类的私有字段吗 他们的子类?
那么答案是否定的,如果我们查看访问说明符的细节,就会提到,私有成员只能在类本身内访问。
但是,如果问题是
我们可以访问超类的私有字段吗 他们的子类?
这意味着,访问私有成员的操作并不重要。在这种情况下,我们可以在超类中创建public方法,你可以访问private成员。因此,在本例中,您创建了一个接口/桥接器来访问私有成员。
其他oop语言,如c++,有友元函数的概念,通过它我们可以访问其他类的私有成员。
不,私有字段不被继承。唯一的原因是子类不能直接访问它们。