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

时间:2011-02-21 10:51:48

标签: 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中的合法代码?我认为“私有”意味着该字段不能在子类中直接访问,并且这是类继承的一个相当基本的原则。使X具体而不是抽象不会改变任何东西。

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

5 个答案:

答案 0 :(得分:3)

事实并非如此。很可能你实际上将Y定义为inner class。这样,外部类的私有字段确实可见。

答案 1 :(得分:2)

也不能为我编译!我怀疑你的Java实现。

答案 2 :(得分:1)

This is impossible.当你解释问题时可能会错过一些东西。

答案 3 :(得分:0)

除了内部类范围之外,

私有成员在继承中不可见。如果您希望子类访问它们,则将它们声明为protected。或使用制定者和吸气剂。

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

答案 4 :(得分:0)

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