在具有静态实例字段的Java类中,是每次访问字段时调用的构造函数,还是仅在第一次访问时调用?我初始化构造函数中的静态字段,并想知道这是否会导致速度变慢,因为每次访问都会初始化字段。
答案 0 :(得分:10)
我初始化构造函数中的静态字段
<强>不即可。永远不要初始化构造函数中的静态字段。 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
。
因此,无论何时想要访问类的任何字段,构造函数都无法发挥作用。
答案 1 :(得分:1)
静态字段对象的构造函数仅在第一次访问字段之前的某个时刻被调用一次。您不应该在常规实例构造函数中初始化静态字段。如果需要特殊初始化,则应提供静态初始化块,如下所示:
public class Test {
static int[][] a = new int[20][];
static {
for (int i = 0 ; i != 20 ; i++) {
a[i] = new int[i+1];
}
}
}
答案 2 :(得分:0)
加载类时会加载静态变量。而且只有一次。 根据{{3}}:
如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。静态字段(有时称为类变量)在初始化类时实现
所以这回答了你的问题。即完全加载类时:)
静态变量一直持续到JVM关闭。