我有点困惑,静态变量和方法是在哪里加载的。我们说静态变量和方法加载在静态内存中。bt public static void main()被加载到堆栈中。既然main()方法也是静态的,那个么main如何可能被加载到堆栈中。alse是静态方法,变量存储在不同的位置,因为我们说方法加载在内存中的不同位置。
这一点的实际实现不可能非常有用,也不容易理解。然而,它的模型可能会帮助您理解这些东西的用途。 首先,数据和代码在java中是完全不同的动物。变量的值在运行时会发生变化;代码从不这样做。因此,当您示例化一个类时,您永远不会得到代码的另一个副本。 考虑课堂 Class -存在它的示例,程序中每个完全限定类一个。我认为一个类的所有代码,不管是静态的还是非静态的,都与它的 Class 示例--“已加载”,如果愿意的话。顺便说一句,巧合的是,这也是我认为它的静态变量被“加载”的地方。 但是示例变量需要多个副本——无论何时示例化该类,都需要它们的另一个副本。因此,它们在示例化时与类的示例相关联(或加载)——将指向类的指针视为指向包含该类所有示例变量的结构的指针,再加上指向其方法的跳转表的指针,等等。 我不知道你说的是什么意思 public static void main 正在“加载到堆栈”。你是说密码吗?代码本身永远不会进入堆栈。如果将(普通)类中的代码放在堆栈上,在当前方法返回时丢失,然后在调用该方法时必须再次加载,这是没有任何意义的。 我想你的问题有一部分我不想回答,因为我不明白你在问什么。
2条答案
按热度按时间cnh2zyt31#
堆栈是调用/执行对象时所处的位置。它是否是静态的并不重要。任何正在运行的函数都会进入堆栈,在堆栈中它是局部变量,所有函数都会一直保持到堆栈框架弹出为止。
例如,我可以
main()
呼叫main()
一次又一次地递归。每一个都将是一个新的堆栈框架。它是一个静态函数这一事实并没有改变这一点。另一方面,静态变量是不同的。它们只有一个示例,并且您明确地知道它。因此,它们可以进入特殊的存储,并以不同的方式进行处理(就像类定义之类的其他全局事物一样)。
aoyhnmkz2#
这一点的实际实现不可能非常有用,也不容易理解。然而,它的模型可能会帮助您理解这些东西的用途。
首先,数据和代码在java中是完全不同的动物。变量的值在运行时会发生变化;代码从不这样做。因此,当您示例化一个类时,您永远不会得到代码的另一个副本。
考虑课堂
Class
-存在它的示例,程序中每个完全限定类一个。我认为一个类的所有代码,不管是静态的还是非静态的,都与它的Class
示例--“已加载”,如果愿意的话。顺便说一句,巧合的是,这也是我认为它的静态变量被“加载”的地方。但是示例变量需要多个副本——无论何时示例化该类,都需要它们的另一个副本。因此,它们在示例化时与类的示例相关联(或加载)——将指向类的指针视为指向包含该类所有示例变量的结构的指针,再加上指向其方法的跳转表的指针,等等。
我不知道你说的是什么意思
public static void main
正在“加载到堆栈”。你是说密码吗?代码本身永远不会进入堆栈。如果将(普通)类中的代码放在堆栈上,在当前方法返回时丢失,然后在调用该方法时必须再次加载,这是没有任何意义的。我想你的问题有一部分我不想回答,因为我不明白你在问什么。