【发布时间】:2022-01-14 03:49:22
【问题描述】:
当程序员未能将任何构造函数写入类时,编译器会提供默认构造函数。据说这些构造函数是用来初始化类属性的默认值的。但是如果程序员提供了构造函数,那么简单的:
public class Main {
int a;
Main() { // user defined simple constructor
System.out.println("hello");
}
public static main(String[] args) {
Main obj = new Main();
}
}
在上面的代码中,用户已经包含了一个构造函数。但是它不会初始化实例变量(a)。此外,不会调用默认构造函数。那么变量'a'怎么会被初始化为它的默认值。
如果是这样,默认构造函数不会将类变量初始化为默认值,编译器会自动执行,那么默认构造函数的实际用途是什么?
为什么在用户编写构造函数失败的情况下,编译器会添加默认构造函数?
【问题讨论】:
-
语言方面,默认构造函数必须存在,语言才有意义并正确编译(如果没有提供其他构造函数)。毕竟,你在写
new Main(),所以代码中必须有一个构造函数Main(),即使你没有写一个。此外,它的内容不为空,它也隐式调用了超级构造函数。super();(本例中为对象)。此外,反射 API 也需要能够访问它(但这是一个高级主题)。 -
@Zabuzard 从技术上讲,您不需要类中的构造函数。有一种奇怪的情况,我不太记得编译器在哪里创建了没有构造函数的合成类,甚至没有默认构造函数或私有构造函数:它们完全不可实例化。
-
Main()不一定是“默认”构造函数。术语“默认构造函数”通常(据我所知)是指当您在源代码中省略显式构造函数时编译器插入的构造函数。这也称为隐式构造函数。这与无参数构造函数不同,构造函数接受零参数。无参数构造函数存在于两种情况:当您定义显式无参数构造函数时,以及当您根本没有定义构造函数时(在这种情况下,编译器会生成一个)。 -
@Zabuzard “我不太记得了”dredging from the distant past.
-
是的,我当时确实看到了,了解到JVM支持不可构造类。但是,如果您希望能够编写
new Main(),则需要在字节码中添加一个构造函数,因此必须添加它(设计方面)。或者,他们也可以决定在 JVM 中不支持无构造函数,然后将字节码中没有构造函数解释为存在默认构造函数的事实——那么就不必添加它。但他们没有那样设计它。这就是我对这个问题的看法。