关于在 Java 中访问受保护成员的问题已经被问过很多次并回答了很多次,例如: Java: protected access across packages
但我不明白为什么它是这样实现的,请参阅“Java 编程语言”(第 4 版)的解释:
“限制背后的原因是:每个子类继承超类的契约并以某种方式扩展该契约。假设一个子类,作为其扩展契约的一部分,对超类的受保护成员的值施加约束。如果不同的子类可以访问第一个子类的对象的受保护成员,然后它可以以破坏第一个子类合同的方式操纵它们,这是不允许的。”
好的,这很清楚,但考虑一下这个继承结构(从一些代码中提取):
package package1;
public class A {
protected int x;
}
package package2;
public class B extends A {
public static void main(String[] args)
C subclass = new C();
subclass.x = 7; // here any constraints can be broken - ??
}
}
class C extends B {
// class which places constraints on the value of protected member x
...
}
这里 subclass.x = 7 是一个有效的声明,它仍然可以打破 C 的合同。我错过了什么?
编辑(添加):也许我不应该在这种情况下应用引用的逻辑?如果我们只处理一个包,则根本不存在任何限制。所以也许直接继承链以简化的方式处理,这意味着超类必须知道它在做什么......