由 jvm 还是编译器放置的构造函数?



我在某处读到调用构造函数是JVM的工作,所以我创建了一个名为Hello的类,根本没有放任何东西,只是编译了它,编译后当我打开字节代码时,在一个类中创建了构造函数,这是默认构造函数。 因此,编译器的职责是放置默认构造函数。 我以为是jvm检查和调用构造函数。 Ps:我没有运行该代码。

我认为是

jvm检查并调用构造函数。

错误的假设。JVM读取已编译的类 (.class( 文件。它不会修改或添加它们。

当然,JVM执行代码,从而调用/调用方法和构造函数。

但是 java 编译器负责将此类内容"添加"为默认构造函数,有关更多详细信息,请参阅此处。

话虽如此,当然还有JIT(及时编译器(是JVM的一部分。但是 JIT 将字节码转换为机器代码,它的工作仍然是,而不是添加诸如其他构造函数之类的东西。

我正在尝试弄清楚你的意思:

我以为是jvm检查和调用构造函数。

"呼唤"是有道理的。

"检查"....不确定。 如果您的意思是 JVM 的类加载器在加载1个类时检查所需的构造函数是否存在,这是正确的。 但是,如果 JVM 发现缺少(默认或其他(构造函数,它不会添加一个。 相反,JVM 将类及其依赖项标记为不可用,抛出Error异常,并且通常会退出。

(请注意,执行上述检查是为了处理编译时和运行时使用的类版本之间存在二进制兼容性不匹配的情况。 通常,您针对一个版本的 API 编译了一个类,并在运行时类路径上使用和放置了一个不兼容的版本。


您可能正在考虑的检查是由字节码编译器完成的。

  • 如果类的源代码中没有构造函数,编译器将定义一个默认构造函数,并将其包含在.class文件中。 这符合JLS所说的。

  • 如果源代码包含使用任何尚未定义的构造函数的new,编译器会将其视为编译错误。

当 JVM 看到 Java 类的任何字节码文件时,它将至少包含一个构造函数。


1 - 我故意在这里省略了一些细节。

如果未在类中显式定义至少一个构造函数,则编译器会自动生成默认构造函数。您已经定义了两个,因此您的类没有默认构造函数。如果未在类中定义任何构造函数,则会创建默认构造函数。它只是一个不做任何事情的无参数构造函数。编辑:除了调用超级((

public Module(){
}

相关内容

最新更新