如果类具有参数化构造函数,为啥Java不提供默认构造函数? [复制]

Posted

技术标签:

【中文标题】如果类具有参数化构造函数,为啥Java不提供默认构造函数? [复制]【英文标题】:Why Java doesn't provide default constructor, if class has parametrized constructor? [duplicate]如果类具有参数化构造函数,为什么Java不提供默认构造函数? [复制] 【发布时间】:2013-04-16 20:13:57 【问题描述】:

如果类具有参数化构造函数,为什么 Java 不提供默认构造函数? 考虑下面的例子

class A 
    int a;

    public A() 
    

    public A(int val) 
        a = val;
    

这里我明确需要添加默认构造函数。有什么原因,为什么Java不为具有参数化构造函数的类提供默认构造函数?

【问题讨论】:

我不认为这是重复的;它在问为什么规范说明了它的作用。 @OrangeDog 这里的困难在于OP问题的字面答案是“当您显式定义构造函数时,编译器不会生成默认构造函数,因为默认构造函数的定义是'当您没有定义另一个时,编译器会定义一个'"。 (他们的public A() 不是默认构造函数。)OP 可能混淆了术语,可能实际上询问了无参数构造函数。如果我们假设 OP 混淆了术语,也许应该编辑这个问题。 【参考方案1】:

原因与安全性和界面的结合有关。编译器不应该给你没有明确定义的方法。如果您不指定任何构造函数,则一个例外是方便的无参数构造函数。如果您确实指定了构造函数,编译器会假定您不需要任何其他构造函数。

【讨论】:

【参考方案2】:

因为如果编译器不自动为每个类提供 arg 构造函数,就会破坏类设计。考虑 Scanner 类。它的构造函数很少,您可以在其中指定要从何处读取数据。如果编译器也不会添加 arg 构造函数,那么在调用 Scanner 的一种方法以从使用此构造函数初始化的对象中读取数据后,将引发异常,因为不会指定数据源。

【讨论】:

【参考方案3】:

在某些情况下,不希望使用默认构造函数。该语言必须提供一些方法来告诉编译器不要生成它。除了显式构造函数的存在之外,使用其他指示符会导致问题,例如在禁用默认值时需要指定构造函数。

当前的安排通过确保在禁用默认值时有另一个构造函数来消除该问题。

【讨论】:

【参考方案4】:

如果你的类没有定义任何构造函数,Java 会给你一个默认构造函数。

如果您定义了 any 构造函数,(即使是没有任何参数的构造函数)编译器也不会再给您一个。

它是这样工作的,因为它是这样指定的。您可以在Language Specification 中阅读更多相关信息

【讨论】:

OP 知道Java doesn't provide default constructor, if class has parametrized constructor。问题是“为什么”?

以上是关于如果类具有参数化构造函数,为啥Java不提供默认构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

golang函数中的参数为啥不支持默认值

子类为啥要调用父类的构造函数

构造函数与析构函数

为啥使用set注入,一定要给类提供一个无参的构造函数,否则Spring不能实例化类的.

为啥 C++ 构造函数在继承中需要默认参数?

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数