所以,我们有
public abstract class A{
protected abstract String f();
}
public class B extends A{
protected String f(){...}
}
public class C extends A{
protected String f(){
A b = (A) Class.forName("B", true, getClass().getClassLoader()).newInstance();
return b.f();
}
这不允许我访问b.f()
,说B.f()
在受保护的范围内,但f
受A
保护,并且{ {1}}扩展C
,它还应该可以访问A
。
答案 0 :(得分:3)
protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。
如果要访问B.f(),则应在与B相同的包中定义C类。
答案 1 :(得分:0)
否,因为编译器不知道b
是B
,C
或其他外部类的实例。
假设有一个类D
,在另一个包中有D extends A
。如果b
是D
的实例(编译器不知道),则b.f()
如果访问权限为protected
则禁止{{1}}(无法通过类访问{{1}}其他包)。