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

Java 如何使成员对其子类可见(可能不在同一个包中)?,java,Java,我有一个抽象基类,其中包含某些字段/抽象方法 即使孩子们不住在同一个包裹里,我如何让孩子们看到这些?(我认为public有点太开放了,protected不起作用!) (对于下面的注释,protected不起作用,因为protected字段仅在同一个包中可见) 为了证明这一点,下面的代码不起作用。请告诉我为什么不 package a; public class Base { protected void foo() {} } // in a separate file/package

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

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

}
a包;
公共阶级基础
{
受保护的void foo(){}
}
//在单独的文件/包中
b包;
公共类子扩展基
{
private Base wrappedBase=new Base();
@凌驾
受保护的void foo()
{

wrappedBase.foo();//通常,您只需使用
protected
,它在JLS中限制的子类中工作:

foo/Parent.java
中:

package foo;

public class Parent {
    protected int x;
}
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;
    }
}
bar/Child.java
中:

package foo;

public class Parent {
    protected int x;
}
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的子类时,才允许访问


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

为什么您认为受保护的
不起作用呢?因为我试过了!(另外,
protected
仅使同一包中的字段可见!)不,绝对不是。请展示您所做的尝试-因为
受保护的
正是为访问子类而设计的。请看。来吧,@onetwotree:Jon Skeet,在这里有最高的代表,告诉您受保护的允许您访问任何子类的成员。他提供了一个到规范的链接。检查您的事实。@OneTwOthere您的示例没有访问它自己的foo方法,而是尝试使用您创建的新对象的方法。请尝试
super.foo()
好吧,这不是我要做的事情。请查看我更新的问题。@onetwotree:查看我更新的答案。但它是访问包外的受保护成员,因此您的声明“受保护字段仅在同一个包中可见”不正确。