在Java中,为什么超类方法不能从子类实例访问受保护的或私有的方法/变量?

m_v*_*aly 7 java oop inheritance class instance

让我们从另一个行为开始:即使您将方法/变量声明为私有,同一个类的另一个实例也可以访问它.没关系,我可以忍受它.我将这些类称为私有而非实例私有.

现在问题部分:例如,在运行时我希望能够检查this类中的所有String变量是否为null,如果它们为null,则应将它们更改为字符串"NULL".

我可以使用反射来运行变量并获取它们的值.但是如果我扩展我的类并添加私有甚至受保护的变量,我的基类就无法访问它们.setAccessible在使用它们之前,我必须对变量进行处理.

所以请向我解释为什么基类(超类)不能从其子类访问私有/受保护的变量.它是它的子类,所以我不明白.这背后有什么想法?

我知道超类不应该知道它的子类,但在我的例子中它是有意义的,不是吗?

是因为我不能或不应该以这种方式限制我的子类?


更新: 根据答案,我还想知道:为什么不从同一个类访问另一个实例的私有变量被视为违反封装?

JP *_*oto 7

这很简单,因为它违反了封装.另一堂课不应该进入你的班级,并且要乱搞一些事情,即使你把这个课程概括.例如,车辆如何了解汽车的任何信息?基类的重点是提供子类,但是像过度保护的父类一样,你所建议的内容太多了.


Yis*_*hai 7

要回答您的更新问题(因为原始问题已得到很好的回答),私有的目的是隐藏实现细节,以便这些实现细节不会成为依赖关系.这是面向对象编程的本质 - 封装确保通过将不同部分隔离到自己的区域来保持复杂性.

由于类知道它自己的实现 - 它定义了它,因此限制对其他实例的访问没有任何好处,因为类实现声明它已经暴露给所有这些细节的所有私有实例.

在这种情况下隐藏它实际上会增加复杂性,因为您必须添加额外的访问级别以允许类级别可见性而不是实例级别可见性,而不实际封装任何进一步的复杂性.