Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何使用私有构造函数创建一个类,其超类也有私有构造函数?_Java_Constructor - Fatal编程技术网

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

在java中,如何使用私有构造函数创建一个类,其超类也有私有构造函数?,java,constructor,Java,Constructor,例如: public class Foo { private Foo() {} } public class Bar extends Foo { private Bar() {} static public doSomething() { } } 这是一个编译错误。类至少需要隐式调用其超类的默认构造函数,在本例中,该构造函数在Foo中不可见 我可以从工具栏调用对象的构造函数吗?您不能。您至少需要将Foo的构造函数包设置为私有的(尽管我可能只是将其设置为受保护

例如:

public class Foo {
    private Foo() {}
}

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

    static public doSomething() {
    }
}
这是一个编译错误。类至少需要隐式调用其超类的默认构造函数,在本例中,该构造函数在Foo中不可见


我可以从工具栏调用对象的构造函数吗?

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


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

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

你不能直接从Bar调用对象的构造函数,因为它是Foo的子类,它必须通过Foo的构造函数,在这种情况下是私有的


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

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

解决这个问题的方法不是找出继承的方法,而是看看你是否可以通过接口来组合对象而不是继承。例如,类Foo现在是接口Foo,带有一个FooImpl。然后接口栏可以扩展Foo,带有一个BarImpl,它与FooImpl没有关系


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

使用Foo(){}有什么原因吗是私有的,而不是受保护的?@svelil:假设它在第三方库中,或者在我的控制之外,我想对它进行子类化。如果两者都放在同一个包中,Package-private就足够了。@starblue-我相信这就是他说“至少”的原因。包比受保护的更具限制性,所以“至少”是错。如果两者都在同一个外部类中,我认为私有构造是可以访问的。如果超类有私有构造函数,那么子类甚至不会编译。