在java中,如何使用私有构造函数创建一个类,其超类也有私有构造函数?
例如:在java中,如何使用私有构造函数创建一个类,其超类也有私有构造函数?,java,constructor,Java,Constructor,例如: public class Foo { private Foo() {} } public class Bar extends Foo { private Bar() {} static public doSomething() { } } 这是一个编译错误。类至少需要隐式调用其超类的默认构造函数,在本例中,该构造函数在Foo中不可见 我可以从工具栏调用对象的构造函数吗?您不能。您至少需要将Foo的构造函数包设置为私有的(尽管我可能只是将其设置为受保护
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
这是一个编译错误。类至少需要隐式调用其超类的默认构造函数,在本例中,该构造函数在Foo中不可见
我可以从工具栏调用对象的构造函数吗?您不能。您至少需要将Foo的构造函数包设置为私有的(尽管我可能只是将其设置为受保护的)
(编辑-这篇文章中的评论说明了一个很好的观点)只要Foo有一个私有构造函数,你就不能创建Bar的实例。唯一的方法是如果Foo有一个受保护的构造函数。你不能直接从Bar调用对象的构造函数,因为它是Foo的子类,它必须通过Foo的构造函数,在这种情况下是私有的
当您将Foo的构造函数声明为私有时,它不会创建默认的公共构造函数。由于Bar必须调用Foo的构造函数,因此不可能将其保留为私有。正如其他人所做的那样,我建议使用protected而不是private。这实际上是一种称为实现继承的不良继承形式的症状。要么原始类不是为继承而设计的,因此选择使用私有构造函数,要么整个API设计糟糕 解决这个问题的方法不是找出继承的方法,而是看看你是否可以通过接口来组合对象而不是继承。例如,类Foo现在是接口Foo,带有一个FooImpl。然后接口栏可以扩展Foo,带有一个BarImpl,它与FooImpl没有关系
在BarImpl内部,如果您希望进行一些代码重用,可以将一个FooImpl作为成员,但这完全取决于实现,不会公开。使用Foo(){}有什么原因吗是私有的,而不是受保护的?@svelil:假设它在第三方库中,或者在我的控制之外,我想对它进行子类化。如果两者都放在同一个包中,Package-private就足够了。@starblue-我相信这就是他说“至少”的原因。包比受保护的更具限制性,所以“至少”是错。如果两者都在同一个外部类中,我认为私有构造是可以访问的。如果超类有私有构造函数,那么子类甚至不会编译。