在具有静态实例字段的 Java 类中,是每次访问字段时调用构造函数,还是仅在第一次访问时调用?我在构造函数中初始化了静态字段,并且想知道这是否会导致速度变慢,因为这些字段在每次访问时都会被初始化。
3 回答
我在构造函数中初始化静态字段,
不要。永远不要在构造函数中初始化静态字段。static
字段不是与类的任何实例相关联的东西。它必须上课。该变量只有一个副本,可以跨所有实例访问。因此,如果您在构造函数中对其进行初始化,那么每次创建实例时,该字段都会为每个其他实例重新初始化。
您应该使用static initializer
块来初始化您的静态字段,或者只是在声明的地方初始化它们。
class Demo {
private static int x; // Either initialize it here.
static { // Or use static initializer block
x = 10;
}
}
使用静态实例字段,是每次访问字段时调用的构造函数,
不,静态字段是在 上访问的class
。它们在类加载时被加载和初始化。然后您可以稍后修改它class name
,在这种情况下,更改将对所有实例生效。因此,无论何时访问,都不会调用构造函数static field
。
事实上,即使您访问实例字段,也不会每次都调用构造函数。构造函数用于新创建的实例一次initialize
。state
并且为了进一步访问和修改该字段,constructor
将不会被调用。
因此,只要您想访问类的任何字段,构造函数就完全没有作用。
静态字段对象的构造函数只被调用一次,在第一次访问该字段之前的某个时间点。您不应在常规实例构造函数中初始化静态字段。如果他们需要特殊初始化,您应该提供一个静态初始化块,如下所示:
public class Test {
static int[][] a = new int[20][];
static {
for (int i = 0 ; i != 20 ; i++) {
a[i] = new int[i+1];
}
}
}
加载类时加载静态变量。而且只有一次。根据JLS:
如果一个字段被声明为静态的,那么无论最终创建多少个类的实例(可能为零),都只存在该字段的一个化身。静态字段,有时称为类变量,在类初始化时体现
所以这回答了你的问题。iee 正是在加载类时:)
静态变量一直持续到 JVM 关闭。