class 的实例是在你第一次调用静态方法时自动创建的

Is an instance of a class automatically created when you first call a static method

我想知道您是否有一个 class 其中只有静态方法,当您调用第一个静态方法时,是否在某处创建了 class 的实际实例?

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

如果确实创建了一个实例,我想更好地了解该实例存在于何处以及存在多长时间。

static 方法属于 class,不属于对象引用。您可以调用 static 方法而忘记在创建正在使用的 class 的对象引用时浪费内存,这不会发生。当您在对象引用上调用 static 方法时,您会收到有关该主题的编译器警告。您甚至可以在所需 class 的变量上调用 static 方法,这个变量可以是 nullstatic 方法将被调用没有问题。

public class Foo {
    public static void sayHello(String name) {
        System.out.println("Hello " + name);
    }
}

//works, no instance of Foo was created
Foo.sayHello("AlexVPerl");
Foo foo = new Foo();
//works, compiler raises a warning here
foo.sayHello("AlexVPerl");
foo = null;
//works, compiler raises a warning here
//and as you can see, it doesn't matter if the instance is null
foo.sayHello("AlexVPerl"); 

没有。调用 static 方法不需要(或创建)class 的实例。另请参阅 JLS-8.4.3.2 static methods 其中(部分)

A method that is declared static is called a class method.

...

A class method is always invoked without reference to a particular object.

假设你有

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

    static int func(){ ... }
}

显然,不会为调用 func().

创建一个 Foo 对象

但是classFoo需要加载到内存中;而对于应用程序,有一个对象对应于class,可以称为Foo.class,或Class.forName("Foo")

加载的 class 尚未初始化。当你第一次调用静态方法时,class 被初始化;一些 "space" 分配给静态变量,并执行静态初始化代码(如 new Bar())。

此 "space" 作为对象对应用程序不可见;但它也是一个内存数据结构,涉及垃圾收集(以及它引用的其他对象,如 bar

class 和 "space" 只有在加载 class 的 classloader 符合 GC 条件时才有资格进行 GC。对于通常的命令行应用程序,这种情况永远不会发生。但是对于很多其他的应用来说,class GC 很重要,class loading 需要小心做。