为什么私有构造函数禁止继承?

Why does private constructor prohibits a inheritance?

我知道两种禁止继承的方式:

要防止继承,必须将 class 的 default 构造函数声明为私有。

class Class {
    private Class() {}    
}

class OtherClass extends Class {
    // Error! There is no default constructor available
}

使用 super 的一切都完成了吗?

class Class {
    public Class() {}
}

class OtherClass extends Class {
    public OtherClass() { super(); } // Did everything done for this opportunity?
}

我想知道为什么您不能从具有私有默认构造函数的 class 继承以及条件是什么?

是不是默认构造函数并不重要。如果 class 的所有构造函数都是私有的,则其子类型的 none 可以具有有效的构造函数,因为所有构造函数都必须调用超类型的构造函数。

在 Java 中,如果您创建 Child Class 的实例,则会隐式创建 Parent Class 实例。 因此 Parent Class 构造函数应该对 Child Class 可见,因为它在第一个语句本身中使用 super() 调用 Parent Class 构造函数的构造函数。

因此,如果将 Parent Class 的构造函数更改为 privateChild Class 将无法访问它并且无法创建自己的任何实例,因此编译器在第一手只是根本不允许这样做。

但是如果你想在 Parent Class 中使用 private 默认构造函数,那么你需要在 Parent Class 中明确创建一个重载的 public 构造函数,然后在 Child class 构造函数,您需要使用 super(param) 调用 Parent Class 的 public 重载构造函数。

此外,您可能会想 private 构造函数有什么用。 private 构造函数主要用于当您不希望来自任何外部 class 的其他人在您的 class 上调用 new() 时。因此,在这种情况下,我们提供了一些 getter() 方法来提供 class 的 object。在该方法中,您可以 create/use 您的 class 的现有对象 & return 它来自那个方法。

例如。 Calendar cal = Calendar.getInstance();。这实际上构成了 Singleton 设计模式的基础。