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

时间:2014-01-15 11:27:43

标签: java

考虑以下代码:

 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类是静态的&amp;公众,但我不能实现这一目标。 Eclipse说:构造函数A.B()不可见

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

4 个答案:

答案 0 :(得分:3)

这与内部课程无关。您的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(); 
  }
 }

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

protected说明符允许所讨论的类的所有子类访问,无论它们驻留在哪个包中,以及同一包中的其他代码。

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

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

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