我们有两种分类,堆和栈。当创建一个对象时,对象的内存存储在堆中。如果类具有静态方法,则可以使用类名称调用该方法。如果没有创建对象,它将如何分配内存,如果它这样做,它将在哪里分配内存?
当类具有静态方法时,它们不需要对象实例就可以调用,它们存储在类本身的内存中,而不是堆或栈中。因此,不需要为静态方法分配内存。相反,它们在加载类时被加载到内存中,在整个程序执行过程中一直存在。我们有两种分类,堆和栈。当创建一个对象时,对象的内存存储在堆中。如果类具有静态方法,则可以使用类名称调用该方法。如果没有创建对象,它将如何分配内存,如果它这样做,它将在哪里分配内存?
当类具有静态方法时,它们不需要对象实例就可以调用,它们存储在类本身的内存中,而不是堆或栈中。因此,不需要为静态方法分配内存。相反,它们在加载类时被加载到内存中,在整个程序执行过程中一直存在。这取决于JVM,但是静态字段通常存储在堆上的一个特殊对象中。您可以在堆转储中看到它。当类加载器被卸载时,其类及其静态“对象”/字段也会被清除。
唯一与静态“对象”不同的是您无法获取对其的引用。(但您可以使用反射访问字段)
方法(即代码)不会存储在对象中;类的所有对象将共享方法的代码。无论是Java、C++还是几乎任何其他语言,任何方法的代码都只有一个副本,无论是静态的还是非静态的。通常有一个特定的内存区域——例如C++这样的本地语言中的CODE段或Java中的特殊堆区域——用于加载代码。
堆的永久代空间(PermGen)包含永久类元数据和描述符信息。
永久代空间总是保留给类和与类相关的内容(静态成员、静态函数等)。
静态函数属于类,因此可以在不创建类对象的情况下调用它们。