Java类inheritance,私有字段可以在子类中访问,为什么?

我的代码非常类似于以下内容。

package my.pkg; public abstract class X { private CapableField field; public abstract void doSomething(); public X(CapableField fieldValue) { this.field = fieldValue; } } 

和:

 package my.pkg.sub; public class Y extends my.pkg.X { public void doSomething() { this.field.doSomething(); } } 

为什么这个甚至是Java中的合法代码? 我认为“私有”意味着该字段不能在子类中直接访问,并且这是类inheritance的一个相当基本的原则。 使X具体而不是抽象不会改变任何东西。

如果我特别希望字段或成员函数只能在定义它的类中访问,而不是在定义类的某个随机子类中,我该怎么办?

这是不可能的。 当你解释你的问题时,可能是你错过了什么。

这不是真的。 很可能你实际上已经将Y定义为内部阶级 。 这样外层类的私有字段确实可见。

不编译也适合我! 我怀疑你的Java实现。

除内部类作用域外,私有成员在inheritance中不可见。 如果您希望子类访问它们,则将它们声明为protected。 或使用二传手和吸气剂。

并且在您的代码中,您在包声明中使用了package关键字,这是不允许的,并且会出现编译错误。

确保您的类分为两个不同的文件。 例如X.java和Y.java,而y不是内部类