Java 继承中的私有成员

我被告知,对于Java子类,它可以继承其超类的所有成员。那么,这是否意味着私人成员呢?我知道它可以继承受保护的成员。

有人可以向我解释一下吗?我现在完全糊涂了。


答案 1

否,私有成员不会被继承,因为私有成员的作用域仅限于定义它的类。仅继承公共成员和受保护成员。

Java 文档中

超类中的私人成员

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

来自JLS

声明为私有的类的成员不会被该类的子类继承。只有声明为受保护或公共的类的成员才会由在包中声明的子类继承,而不是声明该类的包。

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


答案 2

这取决于您对“继承”一词的确切用法。我将通过示例进行解释。

假设您有两个类:和 ,其中 扩展 。此外,还有一个名为 的私有整数。ParentChildChildParentParentvalue

现在的问题是:继承私有吗?在Java中,继承的定义方式是答案为“否”。但是,在一般的OOP术语中,存在轻微的歧义。Childvalue

你可以说它没有继承,因为没有任何地方可以明确引用。也就是说,任何像这样的代码都不能在其中使用,也不能从某些调用代码中使用(显然)。Childvaluethis.valueChildobj.value

但是,从另一种意义上说,你可以说这是遗传的。如果认为 的每个实例也是 的实例,则该对象必须包含 中定义的。即使该类对此一无所知,名为 的私有成员仍然存在于 的每个实例中。因此,从这个意义上说,可以说这是在 中继承的。valueChildParentvalueParentChildvalueChildvalueChild

因此,在不使用“继承”一词的情况下,请记住,子类不知道父类中定义的私有成员。但也要记住,这些私有成员仍然存在于子类的实例中。


推荐