Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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中,静态字段和方法如何占用内存;_Java - Fatal编程技术网

在java中,静态字段和方法如何占用内存;

在java中,静态字段和方法如何占用内存;,java,Java,我在谷歌上搜索。它说静态字段和方法是在编译时加载的。在我看来,编译用于创建类文件,然后在执行时创建线程,程序将占用内存。“在编译时”是什么意思?是指在创建类文件时? 这是URL 我在谷歌上搜索。它表示静态字段和方法已加载 在编译时 当类被类加载器加载时,静态字段和方法被添加到内存中。 此时也会执行静态块,静态字段初始化为提供的值或默认值 它还取决于JVM的版本,以及它在编译时所做的优化(内联值,指定将它们添加到堆上的特殊位置:永久生成)和JIT编译 我在谷歌上搜索。它表示静态字段和方法已加载 在

我在谷歌上搜索。它说静态字段和方法是在编译时加载的。在我看来,编译用于创建类文件,然后在执行时创建线程,程序将占用内存。“在编译时”是什么意思?是指在创建类文件时? 这是URL

我在谷歌上搜索。它表示静态字段和方法已加载 在编译时

当类被
类加载器加载时,静态字段和方法被添加到内存中。
此时也会执行静态块,静态字段初始化为提供的值或默认值

它还取决于JVM的版本,以及它在编译时所做的优化(内联值,指定将它们添加到堆上的特殊位置:永久生成)和JIT编译

我在谷歌上搜索。它表示静态字段和方法已加载 在编译时。在我看来,编译是用来创建类的 文件,然后在执行时,创建线程并运行程序 将占用内存。“在编译时”是什么意思

如中所述

编译器通过将值嵌入字节码而不是在运行时计算值来优化可内联的静态final字段

当您第一次启动JVM并加载一个类时(当类以任何方式第一次被引用时,这是由类加载器完成的),任何静态块或字段都会“加载”到JVM中并变得可访问

它说静态字段和方法是在编译时加载的。在我看来,编译是用来创建类文件[…]

你是对的——这是一个错误的陈述:静态方法和字段在编译时解析;它们不可能在编译时加载,因为您的程序尚未运行

它们的意思是编译器决定静态项在内存中的引用位置,因此在加载程序时,对静态成员的访问不需要额外的计算。这称为静态绑定


相反,对实例成员和实例方法的访问是在运行时决定的:实例字段在内存中的位置取决于实例的位置,而实例方法的位置取决于实例的类型。

请提供一个链接,指向您阅读的位置。这篇文章似乎是关于绑定的,不是内存管理。你能引用一段让你认为“静态字段和方法是在编译时加载的”的话吗?私有的、最终的和静态的方法和变量使用静态绑定并由编译器绑定阅读更多:我在阅读关于静态绑定的文章时发现了这一点。所以我很困惑。你的链接没有包含“在编译时加载”这个词。因此,你的问题毫无意义。这个答案非常清楚。谢谢!我想我理解得更多了。似乎我错误地理解了那句话。另一个问题…那么为什么非静态字段不能在静态方法中重新加载是因为它们的位置不同?不是。这是因为静态方法可以存在于类实例之外,而非静态字段绑定到类实例。@deathlee为了访问非静态(也称为“实例”)字段您需要通过提供一个对象引用来告诉Java您正在访问该字段的对象实例。您肯定可以在静态方法中这样做;但是,与非静态方法不同,在非静态方法中您可以“免费”获得实例,必须在静态方法中显式指定实例。当引用其他答案或外部源的部分内容时,请将它们添加到块引号中。检查一下。@AmalMurali:酷,以后会做的。无论如何,我已经添加了原始答案的链接