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

Ale*_*erl 17 java static-methods instance

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

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

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

Ell*_*sch 13

不.调用static方法不需要(或创建)a的实例class.另见JLS-8.4.3.2 static方法(部分)

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

...

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

  • @AlexVPerl没有封闭对象,静态方法中的匿名类没有父引用. (3认同)
  • 谢谢你的帮助.一个平行的问题,假设您在静态方法中创建一个匿名类,分配给匿名类的父引用会发生什么(如在java匿名和内部类中默认获得一个强引用回到封闭对象)? (2认同)
  • 我假设你的意思是[JLS-15.9.5](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5)匿名类.JLS说(部分)*匿名类总是内部类(第8.1.3节); 它永远不是静态的(§8.1.1,§8.5.1).*无论如何,在方法调用结束时它超出范围(除非它被分配给不同的``static`,引用). (2认同)

Zho*_*gYu 6

说你有

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

    static int func(){ ... }
}
Run Code Online (Sandbox Code Playgroud)

很明显,Foo不会为调用创建一个对象func().

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

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

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

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

  • 除非在Java 8中进行了更改,否则"静态类"在Java中没有意义,除非它是嵌套类. (2认同)