如果每个班级都有一个默认构造函数那么谁生成它,编译器还是 JVM?
简而言之,编译器将在必要时生成默认构造函数。
这绝对是由 Java 到字节码编译器完成的。您可以通过检查适当的.class
文件使用javap
。您应该看到已插入的构造函数。
不过我也想纠正这个可能的误解:
如果每个班级都有一个默认构造函数 ...
事实上,每个班级都没有default构造函数。
A default仅当类没有任何声明的构造函数时,构造函数才会注入到类中。如果源代码声明任何构造函数,则不会注入默认构造函数。例如:
/* 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
文件定义至少一个构造函数。但是,对构造函数的参数计数和类型或构造函数的访问修饰符没有特定的约束。)
另一个答案 https://stackoverflow.com/a/66717501/139985包括建议显式声明无参数构造函数,而不是依赖 Java 插入默认构造函数(见上文)。
我认为这是个坏主意:
-
它对运行时性能的影响为零。
-
It has minimal impact1 on compilation times. And indeed, it might even make compilation a bit slower.
- 如果没有构造函数,编译器会注意到这一点,并注入并代码生成默认构造函数。
- 如果存在显式(空)无参数构造函数,则编译器必须读取、解析和类型检查构造函数,然后代码生成与第一种情况相同的构造函数。
-
可读性的好处值得怀疑。
唯一(国际海事组织)sound选择显式无参数构造函数而不是默认构造函数的原因是:
- 因为还有其他构造函数(这意味着不会有默认的无参数构造函数!),
- 因为你想限制构造函数的可见性;例如宣布它
private
在单例类中,或者
- 因为您想在 javadoc 中为无参数构造函数说一些(有意义的)内容。
1 - My guess would be a few microseconds. Too small to make a noticeable difference.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)