无法从子类访问受保护的方法

f.k*_*sis 5 java inheritance classloader

所以,我们有

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();
}
Run Code Online (Sandbox Code Playgroud)

这不允许我访问b.f(),说它B.f()在受保护的范围内,但f受到保护A,并且自C扩展以来A,它也应该可以访问f().

Ale*_*ean 3

protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,还可以由另一个包中的该类的子类访问。

如果要访问 Bf(),则应该将 C 类定义在与 B 相同的包中。

  • 这是因为 C 类是在不同的包中定义的,并且您无法访问实例上除公共字段之外的其他字段。 (2认同)