如果类有参数化构造函数,为什么Java不提供默认构造函数?

时间:2013-04-16 20:13:58

标签: java constructor

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

class A {
    int a;

    public A() {
    }

    public A(int val) {
        a = val;
    }
}

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

因为如果编译器自动不为每个类提供arg构造函数,它会破坏类设计。考虑一下Scanner类。它有很少的构造函数,您可以在其中指定要从哪里读取数据。如果编译器也没有添加arg构造函数,那么,在调用Scanner的一个方法从用这个构造函数初始化的对象中读取数据之后,将抛出异常,因为不会指定数据源。

答案 2 :(得分:2)

如果您的类没有定义任何内容,Java将为您提供默认构造函数。

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

它的工作原理是这样的,因为它是以这种方式指定的。您可以在Language Specification

中详细了解相关信息

答案 3 :(得分:2)

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

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