Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jvm或编译器放置的构造函数?_Java_Jvm - Fatal编程技术网

Java jvm或编译器放置的构造函数?

Java jvm或编译器放置的构造函数?,java,jvm,Java,Jvm,我在某个地方读到调用构造函数是JVM的工作,所以我创建了一个名为Hello的类,根本没有放任何东西,只是编译了它,编译后,当我打开字节码时,在一个类中创建了一个构造函数,它是默认构造函数。 所以,编译器的职责就是放置一个默认构造函数。 我认为是jvm检查并调用构造函数。 Ps:我还没有运行那个代码 我认为是jvm检查并调用构造函数 错误的假设。JVM读取编译的类(.class)文件。它不会修改或添加它们 当然,JVM执行代码,从而调用方法和构造函数 但是java编译器负责将这些东西“添加”到默认

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

我认为是jvm检查并调用构造函数

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

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

但是java编译器负责将这些东西“添加”到默认构造函数中,有关更多详细信息,请参阅


话虽如此,当然还有作为JVM一部分的JIT(实时编译器)。但是JIT将字节码转换为机器码,它的任务是,不添加诸如附加构造函数之类的东西。

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


我想弄明白你说的是什么意思:

我认为是jvm检查并调用构造函数

“呼叫”是有意义的

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

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


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

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

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

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



1-我故意在这里漏掉一些细节。

是的,确实如此。From:“术语默认构造函数可以指在没有任何程序员定义的构造函数的情况下由编译器自动生成的构造函数”,我不确定矛盾在哪里。JVM调用构造函数,编译器在字节码中创建它。这是两个不同的东西,它们不是同一个东西。您正在将调用构造函数(发生在运行时,因此与编译器无关)与创建构造函数(发生在编译时)混为一谈,它并没有对它们进行修改或添加一个小提示,JVM HotSpot实际上使用了一个修改过的类文件结构,而不是
javac
放入类文件中的结构。看见特别是在类初始化期间,直接从类文件中以BigEndian顺序读取的
ConstantPool
索引将替换为以本机字节顺序读取的
ConstantPoolCache
索引。这似乎是一个基本的语言问题。短语“检查并调用构造函数”并不意味着添加构造函数。OP似乎认为,尽管如此,正如通过查看构造函数的类文件所表明的那样,驳回这个假设不应该应用于原始的literal语句。“check”和“call”这两个词都过于泛化,根本无法为该短语指定真值。OP写道“我创建了一个名为Hello的类,但根本没有放置任何内容”,但您在这里声称“您定义了两个,因此您的类没有默认构造函数”。这与OP所写的直接矛盾。你知道OP吗?你有没有得到我们看不到的信息?
public Module(){
}