【问题标题】:Why does private constructor prohibits a inheritance? [duplicate]为什么私有构造函数禁止继承? [复制]
【发布时间】:2015-10-07 14:39:39
【问题描述】:

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

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

为了防止继承,必须将类的默认构造函数声明为私有。

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

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

【问题讨论】:

  • 您所说的“使用 super 完成了所有工作”是什么意思?
  • 当然你可以从一个带有私有构造函数的类继承。

标签: java inheritance constructor default-constructor


【解决方案1】:

在 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 的公共重载构造函数。

此外,您可能会想,private 构造函数有什么用。 private 构造函数主要用于当您不希望任何外部类的其他人在您的类上调用 new() 时。所以在这种情况下,我们提供了一些getter() 方法来提供类的object。在该方法中,您可以创建/使用您的类的现有对象并从该方法返回它。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多