考虑以下代码:
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的对象?
答案 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
可以访问。