子类是否继承私有字段?

这是一个面试问题。

子类是否继承私人领域?

我回答“否”,因为我们无法使用“正常OOP方式”访问它们。 但面试官认为他们是遗传的,因为我们可以间接地或使用反射来访问这些领域,而他们仍然存在于对象中。

在我回来后,我在javadoc中发现了以下引用:

超级中的私人会员

子类不会继承其父类的私有成员。

你知道面试官的意见吗?


这里的问题/答案中的大部分困惑围绕着继承的定义。

显然,正如@DigitalRoss所解释的,子类的对象必须包含其父类的私有字段。 正如他所说,没有私人成员并不意味着它不在那里。

然而。 这与一个类的继承概念不同。 正如Java世界中存在语义问题的情况一样,仲裁器是Java语言规范(当前是第3版)。

正如JLS所述(https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):

声明为private的类的成员不会被该类的子类继承。 只有被声明为protected或public的类的成员才会被声明在包中声明的子类继承。

这解决了由面试官提出的具体问题:“做子继承私有字段”。 (强调加我)

答案是否定的,他们不。 子类的对象包含其超类的私有字段。 子类本身没有任何其超类的私有字段。

它是一种学究性的语义吗? 是。 这是一个有用的面试问题吗? 可能不会。 但是JLS建立了Java世界的定义,而且它确实(在这种情况下)是明确的。

EDITED(删除了Bjarne Stroustrup的一个平行引用,由于java和c ++之间的差异,可能只会增加混淆,我会让我的回答停留在JLS上:)


认识到虽然有两个类,但只有一个对象是很重要的。

所以,是的,当然它继承了私人领域。 它们大概是正确的对象功能所必需的,虽然父类的对象不是派生类的对象,但派生类的实例绝大多数肯定是父类的实例。 如果没有所有的领域,这不太可能。

不,你不能直接访问它们。 是的,他们是遗传的。 他们必须是。

这是一个很好的问题!


更新:

错误,“不”

好吧,我想我们都学到了一些东西。 由于JLS起源于确切的“未继承”措辞,因此回答“否”是正确的。 由于子类不能访问或修改私有字段,换句话说,它们不会被继承。 但实际上只有一个对象,它确实包含私有字段,所以如果有人以错误的方式使用JLS和教程的话,就很难理解OOP,Java对象和实际发生的事情。

更新以更新:

这里的争议涉及到一个基本的模糊性:究竟究竟在讨论什么? 物体? 或者我们在某种意义上在谈论班级本身? 当描述类而不是对象时,许多纬度是允许的。 所以子类不会继承私有字段,但是作为子类实例的对象肯定包含私有字段。


不可以。私人领域不会被继承......这就是为什么Protected被发明的原因。 这是设计。 我想这证明了保护修饰符的存在。


现在来看上下文。 你的意思是继承的 - 如果它存在于从派生类创建的对象中? 是的。

如果你的意思是它可以对派生类有用。 那么,不。

现在,当你开始函数式编程时,超类的私有字段不会以有意义的方式继承给子类。 对于子类,超类的私有字段与任何其他类的私有字段相同。

在功能上,它不是继承的。 但理想情况是这样。


好吧,只是看看他们引用这个Java教程:

超级中的私人会员

子类不会继承其父类的私有成员。 但是,如果超类具有访问其专用字段的公共或受保护方法,那么这些也可以由子类使用。

请参阅:http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html

我同意,该领域在那里。 但是,子类在这个私人领域没有任何特权。 对于一个子类,私有字段与任何其他类的任何私有字段相同。

我相信这完全是视点问题。 你可以在任何一方塑造论证。 这两种方式都更好。

链接地址: http://www.djcxy.com/p/24109.html

上一篇: Do subclasses inherit private fields?

下一篇: Java: protected access across packages