Javainheritance中的私有成员

我被告知,对于Java子类,它可以inheritance其超类的所有成员。 这甚至意味着私人会员呢? 我知道它可以inheritance受保护的成员。

谁可以给我解释一下这个。 我现在完全糊涂了。

不,私有成员不会被inheritance,因为私有成员的范围仅限于定义它的类。 仅inheritancepublic和protected成员。

Java Documentation

超级私人会员

子类不inheritance其父类的私有成员 。 但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。 嵌套类可以访问其封闭类的所有私有成员 – 包括字段和方法。 因此,子类inheritance的公共或受保护嵌套类可以间接访问超类的所有私有成员。

来自JLS

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

一个有用的链接: 子类是否inheritance了私有字段?

这种取决于你对inheritance这个词的确切用法。 我将通过例子解释。

假设您有两个类: ParentChild ,其中Child扩展Parent 。 此外, Parent有一个名为value的私有整数。

现在问题是: Childinheritance了私人value ? 在Java中,inheritance的定义方式是答案为“否”。 然而,在一般的OOP术语中,存在轻微的模糊性。

你可以说它没有inheritance,因为Child无处可以明确地引用value 。 即任何像this.value这样的代码都不能在Child ,也不能从某些调用代码中使用obj.value (显然)。

但是,从另一个意义上说,你可以说value inheritance的。 如果您认为Child每个实例也是Parent的实例,那么该对象必须包含Parent定义的’value’。 即使Child类对它一无所知,私有成员名称value仍然存在于Child每个实例中。 所以在这个意义上,你可以说这个value是在Childinheritance的。

因此,不使用“inheritance”一词,只需记住子类不知道父类中定义的私有成员。 但是请记住,那些私有成员仍然存在于子类的实例中。

IMO绝不是定义问题。 在基于类的inheritance中,意味着将行为传播给后代。 因为这样的私人成员会inheritance,我不会详细说明这是如何发生的。

实际上我发现“不inheritance”的答案对新开发者来说是危险的,他们不能立即理解私人成员隐藏在你class级的皮肤下,他们(可能)会对其行为产生严重影响,物体等

在计算机科学中“开发先于理解”是很常见的,但是假设某些技术人员编写了一个众所周知的基于类的OO平台的手册所采用的错误“定义”,则避免构建(或破坏)我们的OOP概念。

很抱歉在这么老的post中陈述某些内容,但问题始终有效。

尽管https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2显示私有成员未被inheritance。 实际上,它是由子类inheritance的。 当我们使用调试器来跟踪变量时,它会在“inherited”标签下显示私有成员,所以试试吧。 还有另一篇文章在讨论这个问题,其中大部分都认为不是inheritance的,这误导了很多人,包括我一开始。