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

时间:2015-07-17 19:20:48

标签: java inheritance constructor default-constructor

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

  • 进行最后一课
  • 宣布私有构造函数

为了防止继承,该类的默认构造函数必须宣布为私有。

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?
}

我想知道为什么你不能从具有私有默认构造函数的类继承以及由什么条件限制?

2 个答案:

答案 0 :(得分:3)

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

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

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

此外,您可能会想到private构造函数的用途。 private构造函数主要用于您不希望任何外部类中的其他人在您的课程上调用new()的情况。因此,在这种情况下,我们提供了一些getter()方法来提供课程object。在该方法中,您可以创建/使用您班级的现有对象&从那个方法中返回。

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

答案 1 :(得分:1)

它是否是默认构造函数并不重要。如果类的所有构造函数都是私有的,那么它的子类型都不能有有效的构造函数,因为所有构造函数都必须为超类型调用构造函数。