【问题标题】:Why we cannot inherit a class with the private constructor in Java? [duplicate]为什么我们不能用 Java 中的私有构造函数继承一个类? [复制]
【发布时间】:2019-01-08 19:25:28
【问题描述】:

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

【问题讨论】:

标签: java inheritance constructor private


【解决方案1】:

类中的任何private 事物只能从该类中访问。对于任何其他类,甚至是子类来说,就好像那个私有的东西不存在一样。

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

喜欢:

class Base {
  private Base() { }
  static Base newInstance() { return new Base(); }
}

类子扩展基{ ...

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

【讨论】:

  • 子类构造函数必须强制调用父类构造函数的原因是什么?
  • Java 语言规范是这么说的。想一想:子对象也始终是“基类对象”。它也有基地的所有领域。因此,所有这些字段都必须初始化。
【解决方案2】:

如果它只有 个私有构造函数,则不能从子类调用它们。子类需要调用父类的构造函数之一,但它不能,因为它们不可见。即使您没有显式调用父类构造函数,仍然会隐式调用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); }
}

【讨论】:

  • 为什么要调用父类构造函数?
  • 不调用构造函数就无法正常创建对象的原因相同。构造函数确保对象被正确初始化。如果子类没有调用父类的构造函数,则父对象可能处于无效状态。
  • 那么为什么不让父级的私有构造函数对其子级可用呢?
  • 那么它们就不是私有的了;他们会受到保护。受保护的方法是类的 API 契约的一部分,不能在不冒破坏客户端代码的风险的情况下进行更改。私有方法可以随意更改、添加和删除,无需担心。
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2014-07-16
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多