Java 什么负责生成默认构造函数?

Java 什么负责生成默认构造函数?,java,Java,如果每个类都有一个默认构造函数,那么谁生成它,编译器还是JVM?Java编译器 如果在类中没有实现任何构造函数,Java编译器会将默认构造函数插入到代码中 当然,两者的结果是相同的,并且在源代码.java文件中看不到默认构造函数 我的老师还告诉我,最好在源代码中添加构造函数,即使没有参数 简而言之,编译器将在必要时生成默认构造函数 这肯定是Java到字节码编译器完成的。您可以通过使用javap检查适当的.class文件来确认这一点。您应该看到已插入的构造函数 不过,我也想纠正这种可能的误解: 如

如果每个类都有一个默认构造函数,那么谁生成它,编译器还是JVM?

Java编译器

如果在类中没有实现任何构造函数,Java编译器会将默认构造函数插入到代码中

当然,两者的结果是相同的,并且在源代码.java文件中看不到默认构造函数


我的老师还告诉我,最好在源代码中添加构造函数,即使没有参数

简而言之,编译器将在必要时生成默认构造函数

这肯定是Java到字节码编译器完成的。您可以通过使用javap检查适当的.class文件来确认这一点。您应该看到已插入的构造函数

不过,我也想纠正这种可能的误解:

如果每个类都有一个默认构造函数

事实上,并非每个类都有默认构造函数

只有当类没有声明的构造函数时,才会将默认构造函数注入到类中。如果源代码声明了任何构造函数,则不会注入默认构造函数。例如:

/* This has a no-args constructor, but it is not a "default" constructor */
public class Foo {
   public Foo() {}
}

/* This has no no-args constructor and no "default" constructor */
public class Bar {
   public Bar(int arg) {}
}

/* This has a "default" constructor */
public class Baz {
}
默认构造函数是无参数构造函数,但显式声明的无参数构造函数不是默认构造函数。而且并非所有类都有一个无参数构造函数

在JVM级别,要求.class文件至少定义一个构造函数。但是,对于构造函数的参数计数和类型,或者构造函数的访问修饰符,没有特定的约束

包括一个建议,即显式声明no args构造函数,而不是依赖Java插入默认构造函数(见上文)

我认为这是个坏主意:

它对运行时性能没有影响

它对编译时间的影响最小。事实上,它甚至可能会使编译速度慢一点

如果没有构造函数,编译器会注意到这一点,然后注入代码并生成默认构造函数。 如果有一个显式的空无参数构造函数,编译器必须读取、解析和类型检查该构造函数,然后代码生成与第一种情况相同的构造函数。 可读性的好处值得怀疑

选择显式无参数构造函数而不是默认构造函数的唯一原因是:

因为还有其他构造函数,这意味着不会有默认的无参数构造函数!, 因为您想要限制构造函数的可见性;e、 g.在单例类中将其声明为私有,或 因为您想在javadocs中对no-args构造函数说些有意义的话。
我猜不到1毫秒。太小,无法产生明显的差异。

编译器生成默认构造函数,但只在没有显式构造函数的类中生成。我的老师还告诉我,最好在源代码中添加自己的构造函数,即使没有参数!我认为这样做的唯一原因是限制默认构造函数的可见性。仅仅因为这样做是没有意义的。当然,他还告诉我这样做要快一点,因为当你不写它的时候,编译器必须这样做,所以只需要很少的时间。但我不知道这是否正确,但我不知道这是否正确。我认为,编写显式构造函数所需的时间将比您希望通过这样做节省的所有编译时间都要长。我还建议您不要因为这样做而插入空的默认构造函数。写你真正需要的代码,而不是你认为你需要的代码。不编写空构造函数的另一个原因是,它允许编译器提醒您将来可能出现的错误。是的,我同意@AndyTurner的观点,这是一个大规模的过度优化,如果是出于性能原因的话!否则,他们可能会试图强迫你明确,但这只会增加不必要的复杂性。