Java 保护修饰符

标签 java jls

我刚刚遇到涉及 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/

相关文章:

java - if (str1 == null) 当抛出 NullPointerException 时

java - 我想扩展枚举和对象(通用)

java - Java 编译器的转换

当 return 不为 1 时,Java 阶乘值会发生变化

java - 使用gradle将依赖信息嵌入到manifest中

java - Android 在一切之上叠加一个 View ?

java - Java 类名区分大小写

java - Java 交集类型与接口(interface)类和类型变量的限制

java - 限定名称和字段访问表达式有什么区别?