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

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

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

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

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

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

始终在不引用特定对象的情况下调用类方法。

说你有

 static class Foo { static Bar bar = new Bar(); static int func(){ ... } } 

显然,不会为调用func()创建Foo对象。

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

加载的类尚未初始化。 当你第一次调用静态方法时,该类被初始化; 为静态变量分配一些“空格”,并执行静态初始化代码(如new Bar() )。

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

当加载该类的类加载器符合GC条件时,该类和“空间”仅适用于GC。 对于通常的命令行应用程序,从未发生过。 但对于许多其他应用程序,类GC很重要,需要仔细完成类加载。

static方法属于类,不属于对象引用。 您可以调用static方法,忘记在创建正在使用的类的对象引用时浪费内存,但这种情况不会发生。 在对象引用上调用static方法时,会在主题上收到编译器警告。 您甚至可以在所需类的变量上调用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");