我的代码非常类似于以下内容。
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
具体而不是抽象不会改变任何东西。
如果我特别希望字段或成员函数只能在定义它的类中访问,而不是在定义类的某个随机子类中,我该怎么办?
答案 0 :(得分:3)
事实并非如此。很可能你实际上将Y定义为inner class。这样,外部类的私有字段确实可见。
答案 1 :(得分:2)
也不能为我编译!我怀疑你的Java实现。
答案 2 :(得分:1)
This is impossible.当你解释问题时可能会错过一些东西。
答案 3 :(得分:0)
私有成员在继承中不可见。如果您希望子类访问它们,则将它们声明为protected。或使用制定者和吸气剂。
并且在您的代码中,您在包声明中使用了 package 关键字,这是不允许的,并且会出现编译错误。
答案 4 :(得分:0)
确保您的课程分为两个不同的文件。例如X.java和Y.java,y不是内部类