由jvm或编译器放置的构造函数?
Constructor put by jvm or compliler?
我在某处读到调用构造函数是 JVM 的工作,所以我创建了一个名为 Hello 的 Class 并且根本没有放任何东西,只是编译它,编译后打开字节码在默认构造函数 class 中创建了构造函数。
因此,编译器有责任放置默认构造函数。
我以为是jvm检查并调用了构造函数。
Ps:我没有运行那个代码。
I thought it's jvm who checks and calls constructor.
假设错误。 JVM 读取 编译的classes (.class) 文件。它不会修改或添加它们。
当然,JVM 执行 代码,因此calls/invokes 方法和构造函数。
但是 java 编译器负责 "adding" 这样的默认构造函数,有关详细信息,请参阅 here。
话虽如此,当然还有作为 JVM 一部分的 JIT(即时编译器)。但是 JIT 将字节码翻译成机器码,它的工作又是,而不是添加额外的构造函数之类的东西。
如果您没有在 class 中明确定义至少一个构造函数,则编译器会自动生成一个默认构造函数。您已经定义了两个,所以您的 class 没有默认的 constructor.A 如果您没有在 class 中定义任何构造函数,则会创建默认构造函数。它只是一个什么都不做的无参数构造函数。编辑:除了调用 super()
public Module(){
}
我正在尝试弄清楚你的意思:
I thought it's jvm who checks and calls constructor.
"call" 有道理。
"check" ....不确定。如果您的意思是 JVM 的 classloader 在加载 1 和 class 时检查是否存在 required 构造函数,那是对的。但是,如果 JVM 发现缺少一个(默认或其他)构造函数,它不会只添加一个。相反,JVM 将 class 及其依赖项标记为不可用,抛出 Error
异常,并且通常会退出。
(请注意,上述检查是为了处理在编译时和运行时使用的 classes 版本之间存在二进制兼容性不匹配的情况。通常你编译了一个 class 针对 API 的一个版本,并在运行时 class 路径上使用并放置了一个不兼容的版本。)
您可能正在考虑的检查是由字节码编译器完成的。
如果class的源代码中没有构造函数,编译器会定义一个默认构造函数,并将其包含在.class文件中。这与JLS所说的一致。
如果源代码包含一个 new
使用 any 未定义的构造函数,编译器会将此视为编译错误.
当 JVM 看到 任何 字节码文件时 Java class,它将包含至少一个构造函数。
1 - 我在这里故意遗漏了一些细节。
我在某处读到调用构造函数是 JVM 的工作,所以我创建了一个名为 Hello 的 Class 并且根本没有放任何东西,只是编译它,编译后打开字节码在默认构造函数 class 中创建了构造函数。 因此,编译器有责任放置默认构造函数。 我以为是jvm检查并调用了构造函数。 Ps:我没有运行那个代码。
I thought it's jvm who checks and calls constructor.
假设错误。 JVM 读取 编译的classes (.class) 文件。它不会修改或添加它们。
当然,JVM 执行 代码,因此calls/invokes 方法和构造函数。
但是 java 编译器负责 "adding" 这样的默认构造函数,有关详细信息,请参阅 here。
话虽如此,当然还有作为 JVM 一部分的 JIT(即时编译器)。但是 JIT 将字节码翻译成机器码,它的工作又是,而不是添加额外的构造函数之类的东西。
如果您没有在 class 中明确定义至少一个构造函数,则编译器会自动生成一个默认构造函数。您已经定义了两个,所以您的 class 没有默认的 constructor.A 如果您没有在 class 中定义任何构造函数,则会创建默认构造函数。它只是一个什么都不做的无参数构造函数。编辑:除了调用 super()
public Module(){
}
我正在尝试弄清楚你的意思:
I thought it's jvm who checks and calls constructor.
"call" 有道理。
"check" ....不确定。如果您的意思是 JVM 的 classloader 在加载 1 和 class 时检查是否存在 required 构造函数,那是对的。但是,如果 JVM 发现缺少一个(默认或其他)构造函数,它不会只添加一个。相反,JVM 将 class 及其依赖项标记为不可用,抛出 Error
异常,并且通常会退出。
(请注意,上述检查是为了处理在编译时和运行时使用的 classes 版本之间存在二进制兼容性不匹配的情况。通常你编译了一个 class 针对 API 的一个版本,并在运行时 class 路径上使用并放置了一个不兼容的版本。)
您可能正在考虑的检查是由字节码编译器完成的。
如果class的源代码中没有构造函数,编译器会定义一个默认构造函数,并将其包含在.class文件中。这与JLS所说的一致。
如果源代码包含一个
new
使用 any 未定义的构造函数,编译器会将此视为编译错误.
当 JVM 看到 任何 字节码文件时 Java class,它将包含至少一个构造函数。
1 - 我在这里故意遗漏了一些细节。