为什么我们不能用Java中的私有构造函数继承类?

为什么我们不能用Java中的私有构造函数继承类?,java,inheritance,constructor,private,Java,Inheritance,Constructor,Private,为什么我们不能用Java中的私有构造函数继承类?有人能用简单的例子解释一下吗?一个类中的任何私有的东西都是只能从该类中访问的。对于任何其他类,甚至是子类,它就像私有的东西不存在一样 因此,当您的基类只有一个私有构造函数时,子类就不能对超级构造函数进行任何类型的调用。因为没有这样的构造函数对子类可见 比如: 类子扩展基{ 没有有效的方法来编写giveChild构造函数。因为任何构造函数都必须调用超级构造函数。当然,如果Base有一个非私有构造函数,那么派生类就有一些super()它可以调用。如果

为什么我们不能用Java中的私有构造函数继承类?有人能用简单的例子解释一下吗?

一个类中的任何
私有的
东西都是只能从该类中访问的。对于任何其他类,甚至是子类,它就像私有的东西不存在一样

因此,当您的基类只有一个私有构造函数时,子类就不能对超级构造函数进行任何类型的调用。因为没有这样的构造函数对子类可见

比如:

类子扩展基{

没有有效的方法来编写give
Child
构造函数。因为任何构造函数都必须调用超级构造函数。当然,如果
Base
有一个非私有构造函数,那么派生类就有一些
super()
它可以调用。

如果它只有私有构造函数,则不能从子类调用它们。子类需要调用父类的一个构造函数,但不能,因为它们不可见。即使不显式调用父类构造函数,也会隐式调用
super()
,如果默认构造函数是私有的,则会失败

class Parent {
    private Parent() { }
    private Parent(int param) { }
}

class Child extends Parent {
    // Invalid: Implied call to super(), which is private.
    Child() { }

    // Invalid: Cannot call super(int) since it's private.
    Child() { super(42); }
}

您可以使用私有构造函数扩展类的可能重复项:它必须在同一个编译单元中定义。仅供记录:请不要忘记在某个时候接受答案。为什么需要调用父类构造函数?这与不调用构造函数就无法正常创建对象的原因相同。construckTOR确保对象已正确初始化。如果子类未调用父类的构造函数,则父类对象可能处于无效状态。为什么不让父类的私有构造函数对其子类可用?那么它们就不是私有的;它们将受到保护。受保护的方法是类的API协定的一部分,不能通过不要冒着破坏客户端代码的风险。私有方法可以自由更改、添加和删除,而不必担心任何此类问题。子类构造函数必须调用父类构造函数的原因是什么?Java语言规范如此规定。想想看:子对象也始终是“基类对象”。它也包含来自base的所有字段。因此,所有这些字段都必须初始化。
class Parent {
    private Parent() { }
    private Parent(int param) { }
}

class Child extends Parent {
    // Invalid: Implied call to super(), which is private.
    Child() { }

    // Invalid: Cannot call super(int) since it's private.
    Child() { super(42); }
}