我刚刚遇到涉及 protected 修饰符的奇怪错误。
我有以下代码:
package p1;
public class C1 {
protected void doIt() {}
}
package p2;
public class C2 extends p1.C1 {
private C1 c1_instance;
public void doItAgain() {
c1_instance.doIt(); // wtf!!!!
}
}
我收到错误消息,指出 doIt()
具有 protected 访问权限,无法访问!但是我在子类中并且确实可以访问 doIt()
方法。
这不是bug吗?
最佳答案
我也有这样的印象,protected
意味着“可以从同一个包或子类访问”,但是 Java Language Specification当然更精确,并解释说在 C 的子类 S 中,“如果通过限定名称 Q.Id 进行访问,其中 Q 是表达式名称,则当且仅当表达式 Q 的类型为是 S 或 S 的子类。”
因此您只能通过对您调用的子类的引用来访问父类(super class)的protected
方法,如下所示:
public class C2 extends C1 {
private C2 c2_other_instance;
public void doItAgain() {
c2_other_instance.doIt();
}
}
如果您解释为什么要从子类的不同实例访问父类(super class)的一个实例,那么有人可能会建议更好的设计。否则,您必须将方法设为 public
或将这些类放在同一个包中。
关于Java 保护修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346515/