当前位置: 首页 > 面试题库 >

抽象类中的私有构造函数

祁驰
2023-03-14
问题内容

在Java中,在抽象类中使用私有构造函数的目的是什么?

在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数?

我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。

也许还有更优雅的用法?


问题答案:

如果private构造函数是类的 唯一
构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不希望实例化或子类化。请注意,abstract在这种情况下,修饰符是多余的,无论有没有修饰符,都无法实例化。就像@JB
Nizet在下面指出的那样,abstract修饰符也是一种不好的做法,因为它向类的客户端发送错误的信号。上课实际上应该是final

还有另一种用例,尽管很少见:您可以abstract class使用仅 包含其自身子类*
作为嵌套类的private构造函数的。这种成语确保那些嵌套类是 唯一的子类 。实际上,Java中的s仅使用这种惯用法。

***enum

如果周围还有其他构造函数,那么构造函数确实没有什么特别的privateabstract就像在其他类中一样,它在类中使用。



 类似资料:
  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?

  • 问题内容: 由于我们无法实例化抽象类,那么在抽象类中具有构造函数的必要性是什么? 问题答案: 抽象类被设计为可扩展的,子类中的每个构造函数都必须执行对基类的构造函数的调用,因此,您的抽象类中需要构造函数。 抽象类是一个骨架,因此直接实例化它是没有意义的,因为它仍然不完整(孩子们会提供其余的东西)。

  • TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数

  • 问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条

  • 问题内容: 抽象类可以有构造函数吗? 如果是这样,它将如何使用以及用于什么目的? 问题答案: 是的,抽象类可以具有构造函数。考虑一下: 超类是抽象的,并且具有构造函数。具体的类具有仅对值2进行硬编码的构造函数。具体的类具有允许调用者指定值的构造函数。 抽象构造函数将经常用于强制类约束或不变量,例如设置类所需的最小字段。

  • 问题内容: 为什么Java 中的类有一个? 我们无法实例化一个类,它的构造是什么? 有什么想法吗? 问题答案: Java中的构造函数实际上并不“构建”对象,而是用于初始化字段。 想象一下,您的抽象类具有字段x和y,并且无论最终创建什么实际的具体子类,您总是希望以某种方式对其进行初始化。因此,您将创建一个构造函数并初始化这些字段。 现在,如果您的抽象类有两个不同的子类,则在实例化它们时,将调用它们的