在java中,如何使用其父类也有私有构造函数的私有构造函数创建类?
举个例子:在java中,如何使用其父类也有私有构造函数的私有构造函数创建类?
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
这是一个编译错误在那里。一个类至少需要隐式地调用它的超类的默认构造函数,在这种情况下,它在Foo中不可见。
我可以致电对象的构造函数从吧改为?
你不能。你需要让Foo的构造函数包私人至少是(虽然我可能只是使它保护
(编辑 - 在这个岗位评论做出好点)
包私有就足够了,如果两者都放在同一个包中。 – starblue 2009-01-20 16:59:01
您将无法创建一个Bar实例,只要Foo有一个私有构造函数,只要Foo有一个受保护的构造函数,你就可以做到这一点的唯一方法:
你不能直接从Bar调用Object的构造函数,而它是一个富的子类,它必须通过Foo的构造函数,它是在这种情况下,私人。
当你声明美孚公司的C onstructor私有,它不创建默认的公共构造函数。由于酒吧有来调用Foo的构造函数,因此不可能将其私有。与其他人一样,我会建议使用受保护的而不是私人的。
这实际上是一个不好的形式继承的,称为实现继承的症状。原始类不是被设计为继承的,因此选择使用私有构造函数,或者整个API设计不佳。
这种情况的解决方法是不是想出一个办法来继承,而是看你是否能组成对象,而不是继承的,并通过接口这样做。即,Foo类现在是Foo接口,带有FooImpl。然后界面栏可以使用BarImpl扩展Foo,它与FooImpl无关。
里面BarImpl,你可以,如果你希望做一些代码重用,有FooImpl中的一员,但是这完全取决于执行,并不会被暴露。
Foo(){}被私有而不是被保护是否有理由? – 2009-01-20 16:49:16
@svelil:假设它位于第三方库中,或者在我的控制之外,我想对它进行子类化。 – 2009-01-20 17:08:27