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