5

举个例子:

public class Foo {
    private Foo() {}
}

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

    static public doSomething() {
    }
}

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

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

4

4 回答 4

10

你不能。您至少需要将 Foo 的构造函数包设为私有(尽管我可能只是将其设为受保护的。

(编辑 - 这篇文章中的评论是一个很好的观点)

于 2009-01-20T16:47:24.703 回答
7

这实际上是一种不良继承形式的症状,称为实现继承。要么原始类没有被设计为被继承,因此选择使用私有构造函数,或者整个 API 设计不佳。

解决此问题的方法不是找出继承的方法,而是查看是否可以组合对象而不是继承,并通过接口来实现。即,类 Foo 现在是接口 Foo,带有 FooImpl。那么界面bar可以扩展Foo,带有一个与FooImpl无关的BarImpl。

在 BarImpl 内部,如果您希望进行一些代码重用,您可以在内部有一个 FooImpl 作为成员,但这完全取决于实现,不会暴露。

于 2009-01-21T10:14:23.263 回答
2

只要 Foo 具有私有构造函数,您就无法创建 Bar 的实例。你能做到的唯一方法是如果 Foo 有一个受保护的构造函数。

于 2009-01-20T16:47:31.800 回答
1

当它是 Foo 的子类时,您不能直接从 Bar 调用 Object 的构造函数,它必须通过 Foo 的构造函数,在这种情况下它是私有的。

当您将 Foo 的构造函数声明为私有时,它不会创建默认的公共构造函数。由于 Bar必须调用 Foo 的构造函数,因此不可能将其保留为私有。和其他人一样,我建议使用受保护的而不是私有的。

于 2009-01-20T16:50:46.130 回答