抽象类 A 中包含的嵌套静态类 B 的受保护构造函数的可见性



考虑以下代码:

 public abstract class AbstractA
 {
  public static final class B
  { 
   protected B(){}
  }
 }
 // a class (in another package) that inherits from AbstractA
 public class C extends AbstractA
 {
  B[] arrayOfB=new B[10]; 
  for(byte i=0; i<=arrayOfB.length; i++)
  {
   arrayOfB[i]=new B(); 
  }
 }

在类 C 中,我可以定义 arrayOfB,因为类 B 是静态的和公共的,但我不能实例化这个对象。Eclipse 说: 构造函数 A.B() 不可见

如果类 C 与类 A 在同一个包中,我可以实例化它。我怎样才能保护构造函数 B() 并仍然创建一个知道类 C 继承自 A 的对象?

这与内部类无关。您的B构造函数受到保护,这意味着只有子类可以访问它,但是您将类定义为final,这没有意义。也许你可以向 AbstractA 添加一个工厂方法,该方法创建B实例,外部类可以访问其内部类,即使是私有方法。

 public abstract class AbstractA
 {
  protected B newB() {return new B();}
  public static final class B
  { 
   private B(){}
  }
 }
 // a class (in another package) that inherits from AbstractA
 public class C extends AbstractA
 {
  B[] arrayOfB=new B[10]; 
  for(byte i=0; i<=arrayOfB.length; i++)
  {
   arrayOfB[i]=this.newB(); 
  }
 }
嵌套

的公共静态类与单独文件中的公共类相同。所以你看不到 B 的构造函数,因为你不是 B 的后代,也不在同一个包中。

如果要将类扩展到包之外,它必须具有公共或受保护的构造函数,因为在 Java 中,每个构造函数都必须从其超类调用构造函数。

(隐式super()调用将失败。

protected说明符允许相关类的所有子类(无论它们驻留在什么包中)以及访问同一包中的其他代码。

在您的情况下,类C驻留在不同的包中,因此由于上述原因,您不允许实例化A.B()

请记住,protected说明符只允许不同包中的继承。您无法直接访问它们。

作为问题的解决方案,请将类C移动到与 AbstractA 相同的包中,以使B可访问。

最新更新