【问题标题】:Where does static variables and methods are loaded in java?java中的静态变量和方法在哪里加载?
【发布时间】:2021-07-07 00:51:53
【问题描述】:

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

【问题讨论】:

  • 首先,Java 虚拟机管理它。其次,static 变量在 Java 中是全局的。方法不是变量。但是 JVM 负责加载包含类定义、类内变量定义、所述变量的初始化以及方法调用(包括参数和返回堆栈)的字节码。您要解决什么问题,了解这些对您解决问题有何帮助?
  • 代码未“加载”到堆栈中。您可能对代码本身的概念和为保存与该代码实例的执行相关的数据(如局部变量、保存的寄存器、参数等)而创建的堆栈帧的概念感到困惑。

标签: java


【解决方案1】:

堆栈是事物被调用/执行时所在的位置。不管它是否是静态的。任何正在运行的函数都会进入堆栈,它是局部变量,并且在堆栈帧被弹出之前都被保留。

例如,我可以让main() 反复调用main()。每一个都是一个新的堆栈帧。它是一个静态函数这一事实并没有改变这一点。

另一方面,静态变量是不同的。它们只有一个实例,您明确地知道它。因此,它们可以进入特殊存储并得到不同的处理(与其他全局事物一样,如类定义等等)。

【讨论】:

    【解决方案2】:

    这个的实际实现不是很有用,也不是很容易理解。但是,它的模型可能会帮助您了解这些东西的用途。

    首先,Java 中的数据和代码是完全不同的动物。变量将具有在运行时更改的值;代码从不这样做。所以当你实例化一个类时,你永远不会得到另一个代码副本。

    考虑类Class - 它的实例存在,程序中的每个完全限定类都有一个。我认为一个类的所有代码(无论是否为静态)都与其Class 实例相关联——如果您愿意,可以与它一起“加载”。顺便说一下,这也是我认为它的静态变量被“加载”的地方。

    但是实例变量需要多个副本——无论何时实例化类,都需要它们的另一个副本。因此,它们在实例化时与类的实例相关联(或加载)——将指向类的指针视为指向包含该类的所有实例变量的结构的指针,以及指向其方法的跳转表的指针等。

    我不知道public static void main 被“加载到堆栈上”是什么意思。你是说代码吗?代码本身永远不会进入堆栈。将(普通)类中的代码放入堆栈,在当前方法返回时丢失,然后在调用该方法时必须再次加载它,这是没有任何意义的。

    我认为你的问题有一部分我没有回答,因为我不明白你在问什么。

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 2010-09-10
      相关资源
      最近更新 更多