考虑以下代码:
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
可访问。