举个例子:
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
那是一个编译错误。一个类至少需要隐式调用其超类的默认构造函数,在这种情况下,它在Foo中不可见。
我可以从Bar调用Object的构造函数吗?
举个例子:
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
那是一个编译错误。一个类至少需要隐式调用其超类的默认构造函数,在这种情况下,它在Foo中不可见。
我可以从Bar调用Object的构造函数吗?
你不能。您至少需要将 Foo 的构造函数包设为私有(尽管我可能只是将其设为受保护的。
(编辑 - 这篇文章中的评论是一个很好的观点)
这实际上是一种不良继承形式的症状,称为实现继承。要么原始类没有被设计为被继承,因此选择使用私有构造函数,或者整个 API 设计不佳。
解决此问题的方法不是找出继承的方法,而是查看是否可以组合对象而不是继承,并通过接口来实现。即,类 Foo 现在是接口 Foo,带有 FooImpl。那么界面bar可以扩展Foo,带有一个与FooImpl无关的BarImpl。
在 BarImpl 内部,如果您希望进行一些代码重用,您可以在内部有一个 FooImpl 作为成员,但这完全取决于实现,不会暴露。
只要 Foo 具有私有构造函数,您就无法创建 Bar 的实例。你能做到的唯一方法是如果 Foo 有一个受保护的构造函数。
当它是 Foo 的子类时,您不能直接从 Bar 调用 Object 的构造函数,它必须通过 Foo 的构造函数,在这种情况下它是私有的。
当您将 Foo 的构造函数声明为私有时,它不会创建默认的公共构造函数。由于 Bar必须调用 Foo 的构造函数,因此不可能将其保留为私有。和其他人一样,我建议使用受保护的而不是私有的。