Java跨包静态导入protected静态成员的可见性问题
跨包访问protected静态成员的问题解答
先直接给结论:未继承B的类C完全不能访问B.VALUE,原因得从Java的protected访问规则说起。
你给出的B类里,VALUE是protected static final修饰的——别被static迷惑了,protected的访问权限规则对静态成员和实例成员是一致的:
- 同一个包内的类可以访问;
- 不同包的子类可以访问;
- 其他情况(不同包且非子类)一律无权访问。
类C在包a,既不在B所在的包b,也没有继承B,完全不符合上面两个允许访问的条件,所以不管你是直接通过B.VALUE调用,还是尝试静态导入,都会触发编译错误。比如你写这样的代码:
package a; import b.B; import static b.B.VALUE; class C { void test() { // 编译报错:B.VALUE has protected access in b.B System.out.println(B.VALUE); // 同样报错,静态导入也无法绕过权限检查 System.out.println(VALUE); } }
而类A能正常访问,正是因为它是B的子类,满足了“不同包子类”的访问条件,所以才能合法使用这个protected静态成员。
内容的提问来源于stack exchange,提问作者marsouf
相关产品推荐
相关产品推荐

