【发布时间】:2015-09-12 02:16:27
【问题描述】:
我有三个班级:
package pac;
public class A {
protected A a;
protected final int i = 10;
}
public class B extends A {
void foo() {
A a = new A();
int b = a.a.i; //compiles fine
}
}
package another.pac;
public class C extends A {
void foo() {
A a = new A();
int b = a.a.i; //Does not compile. a.a is inaccessible
}
}
为什么我们不能从放入另一个包中访问受保护的成员,但我们可以从同一个包中访问?它们都是一个的子类,因此应该允许访问。
JLS 6.6.2.1 说:
如果通过字段访问表达式 E.Id 或方法进行访问 调用表达式 E.Id(...) 或方法引用表达式 E :: Id,其中 E 是主表达式(第 15.8 节),则访问权限为 当且仅当 E 的类型是 S 或 S 的子类时才允许。
C 类满足要求。怎么了?
【问题讨论】:
-
这就是protected的思想,只有同一个包中的类才能访问它...否则公开
-
@Danielson 这就是受保护的想法,只有同一个包中的类才能访问它...否则将其公开。不正确。
-
@ChetanKinger 很好的解释...非打包类不能直接访问字段...可以通过继承,但是你调用的是包内的类
-
@Danielson 但是你正在调用包内的一个类。不明白你的意思。你能详细说明一下吗?