java中静态变量和方法在哪里加载?

wkyowqbh  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(360)

我有点困惑,静态变量和方法是在哪里加载的。我们说静态变量和方法加载在静态内存中。bt public static void main()被加载到堆栈中。既然main()方法也是静态的,那个么main如何可能被加载到堆栈中。alse是静态方法,变量存储在不同的位置,因为我们说方法加载在内存中的不同位置。

cnh2zyt3

cnh2zyt31#

堆栈是调用/执行对象时所处的位置。它是否是静态的并不重要。任何正在运行的函数都会进入堆栈,在堆栈中它是局部变量,所有函数都会一直保持到堆栈框架弹出为止。
例如,我可以 main() 呼叫 main() 一次又一次地递归。每一个都将是一个新的堆栈框架。它是一个静态函数这一事实并没有改变这一点。
另一方面,静态变量是不同的。它们只有一个示例,并且您明确地知道它。因此,它们可以进入特殊的存储,并以不同的方式进行处理(就像类定义之类的其他全局事物一样)。

aoyhnmkz

aoyhnmkz2#

这一点的实际实现不可能非常有用,也不容易理解。然而,它的模型可能会帮助您理解这些东西的用途。
首先,数据和代码在java中是完全不同的动物。变量的值在运行时会发生变化;代码从不这样做。因此,当您示例化一个类时,您永远不会得到代码的另一个副本。
考虑课堂 Class -存在它的示例,程序中每个完全限定类一个。我认为一个类的所有代码,不管是静态的还是非静态的,都与它的 Class 示例--“已加载”,如果愿意的话。顺便说一句,巧合的是,这也是我认为它的静态变量被“加载”的地方。
但是示例变量需要多个副本——无论何时示例化该类,都需要它们的另一个副本。因此,它们在示例化时与类的示例相关联(或加载)——将指向类的指针视为指向包含该类所有示例变量的结构的指针,再加上指向其方法的跳转表的指针,等等。
我不知道你说的是什么意思 public static void main 正在“加载到堆栈”。你是说密码吗?代码本身永远不会进入堆栈。如果将(普通)类中的代码放在堆栈上,在当前方法返回时丢失,然后在调用该方法时必须再次加载,这是没有任何意义的。
我想你的问题有一部分我不想回答,因为我不明白你在问什么。

相关问题