我有一个抽象的基类,其中包含某些字段/抽象方法。
即使孩子不住在同一个包裹中,如何让孩子看到它们? (我认为public
有点过于开放,protected
不起作用!)
(对于下面的评论,protected
不起作用,因为protected
字段在同一个包中只能访问
为了证明这一点,下面的代码不起作用。请告诉我为什么不。
package a;
public class Base
{
protected void foo() {}
}
// in a separate file/package
package b;
public class Child extends Base
{
private Base wrappedBase = new Base();
@Override
protected void foo()
{
wrappedBase.foo(); // <<<<< This throws "The method foo from type Base is not visible"
}
}
答案 0 :(得分:4)
Normaly,您只需使用protected
,其中 在JLS 中的限制内的子类中工作:
在foo/Parent.java
:
package foo;
public class Parent {
protected int x;
}
在bar/Child.java
:
package bar;
import foo.Parent;
public class Child extends Parent {
public Child() {
// Look ma, access to a protected variable declared
// by my superclass in a different package!
x = 10;
}
}
现在您给出的示例略有不同,因为您尝试通过编译时类型Base
...和来访问受保护变量他们没有工作。您只能通过与执行访问的代码(或子类型)具有相同编译时类型的表达式来访问受保护的成员。根据{{3}}:
设C是声明受保护成员的类。只允许在C的子类S的主体内访问。
此外,如果Id表示实例字段或实例方法,则:
如果访问是通过限定名称Q.Id,其中Q是ExpressionName,则当且仅当表达式Q的类型为S或S的子类时才允许访问。
如果访问是通过字段访问表达式E.Id,其中E是主表达式,或者是通过方法调用表达式E.Id(...),其中E是主表达式,那么当且仅当E的类型是S或S的子类时才允许访问。
无法提供对所有子类的所有对象的受保护成员的访问权限。这是故意的 - 它只是为了访问更多其他类型的成员而阻止代码创建子类。