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
方法,这个变量可以是 null
,static
方法将被调用没有问题。
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 需要小心做。
我想知道您是否有一个 class 其中只有静态方法,当您调用第一个静态方法时,是否在某处创建了 class 的实际实例?
这在内存管理方面有点难以理解,因为您从未实际调用构造函数或显式创建方法的实例。
如果确实创建了一个实例,我想更好地了解该实例存在于何处以及存在多长时间。
static
方法属于 class,不属于对象引用。您可以调用 static
方法而忘记在创建正在使用的 class 的对象引用时浪费内存,这不会发生。当您在对象引用上调用 static
方法时,您会收到有关该主题的编译器警告。您甚至可以在所需 class 的变量上调用 static
方法,这个变量可以是 null
,static
方法将被调用没有问题。
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 需要小心做。