在java中,如何使用私有构造函数创建一个类,其超类也有一个私有构造函数?

时间:2009-01-20 16:44:36

标签: java constructor

举个例子:

public class Foo {
    private Foo() {}
}

public class Bar extends Foo {
    private Bar() {}

    static public doSomething() {
    }
}

那是一个编译错误。一个类至少需要隐式调用它的超类的默认构造函数,在这种情况下,它在 Foo 中是不可见的。

我可以从 Bar 调用 Object 的构造函数吗?

4 个答案:

答案 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。