java静态实例字段和构造函数

在具有静态实例字段的Java类中,是每次访问字段时调用的构造函数,还是仅在第一次访问时调用? 我初始化构造函数中的静态字段,并想知道这是否会导致速度变慢,因为字段是在每次访问时初始化的。

我初始化构造函数中的静态字段,

不要 。 永远不要初始化构造函数中的静态字段。 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 :

如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。 初始化类时,会生成静态字段(有时称为类变量)

所以这回答了你的问题。 iee正好在加载类时:)

静态变量持续到JVM关闭。