是首次调用静态方法时自动创建的类的实例

2022-09-03 01:26:30

我想知道如果你有一个只有静态方法的类,当你调用第一个静态方法时,这个类的实际实例是否会在某个地方创建?

在内存管理方面,这有点令人困惑,因为您从未实际调用构造函数或显式创建方法的实例。

如果确实创建了一个实例,我想更好地了解此实例的生存位置和持续时间。


答案 1

哈哈调用方法不需要(或创建)的 实例。另请参阅 JLS-8.4.3.2 静态方法,其中说(部分)staticclass

声明的方法称为类方法。static

...

调用类方法时始终不引用特定对象。


答案 2

说你有

static class Foo
{
    static Bar bar = new Bar();

    static int func(){ ... }
}

显然,不会创建用于调用 的对象。Foofunc()

但是,该类需要加载到内存中;对于应用程序,有一个与该类对应的对象,可以称为 、 或 。FooFoo.classClass.forName("Foo")

装入的类尚未初始化。当您第一次调用静态方法时,该类被初始化;为静态变量分配一些“空间”,并执行静态初始值设定项代码(如)。new Bar()

这个“空间”作为一个对象对应用程序是不可见的;但它也是一个内存中的数据结构,涉及垃圾回收(以及它所指的其他对象,如bar)

仅当加载类的类装入器符合 GC 条件时,类和“空间”才有资格获得 GC。对于通常的命令行应用程序,这永远不会发生。但对于许多其他应用程序,类GC很重要,类加载需要仔细完成。


推荐