如何使成员对其子类(可能不在同一个包中)可见?

时间:2014-03-21 14:04:32

标签: java

我有一个抽象的基类,其中包含某些字段/抽象方法。

即使孩子不住在同一个包裹中,如何让孩子看到它们? (我认为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"
      }

}

1 个答案:

答案 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 ...和来访问受保护变量

  

设C是声明受保护成员的类。只允许在C的子类S的主体内访问。

     

此外,如果Id表示实例字段或实例方法,则:

     
      
  • 如果访问是通过限定名称Q.Id,其中Q是ExpressionName,则当且仅当表达式Q的类型为S或S的子类时才允许访问。

  •   
  • 如果访问是通过字段访问表达式E.Id,其中E是主表达式,或者是通过方法调用表达式E.Id(...),其中E是主表达式,那么当且仅当E的类型是S或S的子类时才允许访问。

  •   

无法提供对所有子类的所有对象的受保护成员的访问权限。这是故意的 - 它只是为了访问更多其他类型的成员而阻止代码创建子类。