2011-10-06 99 views
10

我们有两个分类堆栈。当一个对象被创建时,对象的内存被存储在堆中。如果该类具有可以使用类名称调用的静态方法,该怎么办?如果没有创建对象,那么它将如何分配内存,如果它确实在哪里分配内存?静态方法内存分配

+1

哪种语言? – NPE

+2

这是什么分配内存的目的是为了? –

+0

从他的评论中可以清楚看出它是Java,所以我添加了一个Java标记。 –

回答

1

方法(即代码)不存储在对象中;一个类的所有对象将共享一个方法的代码。不管语言如何(Java,C++或几乎任何其他语言),任何方法的代码只有一个副本,不管是否是静态的。通常有一个特定的内存区域 - 即C++等本地语言中的代码段,或Java中的特殊堆区 - 加载代码的地方。

+0

对象的确定内存与类一起创建。即在堆中只创建类的内存(java)只有当我们使用new运算符时,我们才能创建内存。但是对于像Math这样的类,我们不能实例化。在这种情况下,内存在哪里创建? – Harini

+0

正如我所说(但我不确定你是否理解),代码不存储在对象中,所以这根本不是问题。事实上,它不存储在任何你可以到达的地方。它存储在堆的特殊部分的其他地方。 JVM从类文件中加载字节码,并以某种实现相关的方式对其进行转换,并使这些方法可用于您的程序。 –

+0

@ user980918 java.lang.Math在运行时不需要太多的内存 - 我能想到的唯一一件事就是包含一个Random对象的静态变量。类的静态变量与'Class'对象一起存储在堆中。 (方法中的局部变量在堆栈中,与方法的静态无关。) –

2

它依赖于JVM,但静态字段通常存储在堆上的特殊对象中。 (你可以在堆转储中看到它)当ClassLoader被卸载时,它的类和静态“对象”/字段也被清除。

关于静态“对象”的唯一不同之处是您无法获得对它的引用。 (但你可以使用反射来访问字段)