java为什么受保护的实例成员在不同包的子类中不可见,而受保护的类成员却可见?
package one;
public class A {
protected int first;
protected static int second;
}
package two;
import one.A;
public class B extends A {
public void someMethod() {
this.first = 5; //works as expected
B.second = 6; //works
A a = new A();
// a.first = 7; does not compile
//works just fine, but why?
a.second = 8;
A.second = 9;
}
}
为什么不将相同的限制应用于静态字段,其背后的想法是什么
# 1 楼答案
从JLS 6.6.2
从6.6.2.1
this.first = 5;
之所以有效,是因为B
是A
的实现者A.second
之所以有效,是因为此限制仅为对象的成员定义。这同样适用于B.second
至于为什么是这样指定的,你必须询问定义规范的人——我们只能做出假设6.6.2.1甚至有一个例子表达了类似的问题:
我建议你去Why we should not use ^{} in Java 看看
protected
的语义是针对实例成员的-protected static
与protected
的目的相矛盾,这可能是它没有以同样的方式受到限制的原因