Ale*_*erl 17 java static-methods instance
我想知道你是否有一个只有静态方法的类,当你调用第一个静态方法时,是否会在某个地方创建一个类的实际实例?
这在内存管理方面有点令人困惑,因为您从未实际调用构造函数或显式创建方法的实例.
如果确实创建了一个实例,我想更好地了解这个实例的存在位置和持续时间.
Ell*_*sch 13
不.调用static方法不需要(或创建)a的实例class.另见JLS-8.4.3.2 static方法(部分)
声明的
static方法称为类方法.
...
始终在不引用特定对象的情况下调用类方法.
说你有
static class Foo
{
static Bar bar = new Bar();
static int func(){ ... }
}
Run Code Online (Sandbox Code Playgroud)
很明显,Foo不会为调用创建一个对象func().
但是,该类Foo需要加载到内存中; 并且对于应用程序,存在对应于该类的对象,其可以被称为Foo.class或Class.forName("Foo").
加载的类尚未初始化.当你第一次调用静态方法时,该类被初始化; 为静态变量分配一些"空格",并执行静态初始化代码(如new Bar()).
这个"空间"对于作为对象的应用是不可见的; 但它也是一个内存数据结构,它涉及垃圾收集(以及它引用的其他对象,如bar)
当加载类的类加载器符合GC条件时,该类和"空格"仅适用于GC.对于通常的命令行应用程序,从未发生过.但对于许多其他应用程序,类GC很重要,需要仔细完成类加载.