关于oop:为什么在java中键入带参数的构造函数时没有提供默认构造函数?

Why the default constructor is not provided when typing an argument-ed constructor in java?

在java中,如果我们为一个类键入一个带参数的构造函数,我们不能调用它的默认无参数构造函数。我知道这是因为如果我们键入任何带参数的构造函数,编译器不会提供默认的无参数构造函数。但我的问题是这样设计的原因是什么?


如果你提供一个带有参数的构造函数,它假定对象将被创建为有效状态。

如果默认情况下暴露了无参数构造函数(并且类的创建者没有采取防御措施),那么有人可能会无意中创建一个无效的对象——一个没有足够信息来正确的对象。

通过强制我们提供一个无参数的构造函数,Java 强制我们明确地表明创建一个没有这些初始值/状态的对象是可以的。

简而言之:Java 试图将我们从自己手中拯救出来,因为我们草率且健忘。


当您不提供构造函数时,它会假定您需要一个并为您创建一个。

当您提供构造函数时,它假定您知道自己在做什么,并且您将提供您真正想要的每个构造函数。这是为了防止创建无效的默认构造函数。


是为了让类设计者禁止使用无参构造函数。

这可能有多种原因,例如该类有一些通过构造函数参数初始化的成员,因此在函数中,该类可以安全地假设这些成员不为空。

如果默认构造函数仍然可用,每个函数都应该检查这个成员是否为空。


可以这样做:编译器可以看到没有默认构造函数但有一个 (T...) 构造函数,并创建一个:

1
...() { this(new T[0]); }

要么被遗忘,要么被认为丑陋。当有 (U...) 时怎么办?