java - java中的静态变量和方法在哪里加载?
问题描述
我有点困惑静态变量和方法在哪里加载。我们说静态变量和方法加载在静态内存中。bt public static void main() 被加载到堆栈中。由于 main() 方法也是静态的,那么 main 是如何加载到堆栈中的。还有就是静态方法和变量存储在不同的位置,因为我们说方法加载在内存中的不同位置。
解决方案
这个的实际实现不是很有用,也不是很容易理解。但是,它的模型可能会帮助您了解这些东西的用途。
首先,数据和代码在 Java 中是完全不同的动物。变量将具有在运行时更改的值;代码从不这样做。所以当你实例化一个类时,你永远不会得到另一个代码副本。
考虑类Class
- 它的实例存在,程序中每个完全限定的类都有一个。我认为一个类的所有代码,不管是静态的还是非静态的,都与它的Class
实例相关联——如果你愿意,可以用它“加载”它。顺便说一句,这也是我认为它的静态变量被“加载”的地方。
但是实例变量需要多个副本——无论何时实例化类,都需要它们的另一个副本。因此,它们在实例化时与类的实例相关联(或加载)——将指向类的指针视为指向包含该类的所有实例变量的结构的指针,以及指向其方法的跳转表的指针, ETC。
我不知道您所说的public static void main
“加载到堆栈上”是什么意思。你是说代码吗?代码本身永远不会进入堆栈。将(普通)类中的代码放在堆栈上,在当前方法返回时丢失,然后在调用该方法时必须再次加载它是没有任何意义的。
我认为你的问题有一部分我没有回答,因为我不明白你在问什么。
推荐阅读
- javascript - 导航到新选项卡时 CSS :hover 未清除
- javascript - HTML DIV 没有从右到左斜向末端移动
- r - 如何在 Plotly 旭日形图中定义元素的顺序?
- kubernetes - Traefik Kubernetes 找不到 404 页面
- android - 将类似的 Android 应用程序合并到一个项目中,并从中构建两个不同的应用程序
- php - Flysystem:谷歌云存储适配器 - 缓存控制
- python - 将 (groupby().get_group()) 的输出存储在不同的数据帧中
- ios - Swift:解开字典会打乱其中值的顺序
- php - Cakephp 单元测试中的不完整、跳过或有风险的测试
- android - Android 模拟器“允许 USB 调试”对话框在显示后立即关闭