3

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

4

3 回答 3

13

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

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

事实上,即使您访问实例字段,也不会每次都调用构造函数。构造函数用于新创建的实例一次initializestate并且为了进一步访问和修改该字段,constructor将不会被调用。

因此,只要您想访问类的任何字段,构造函数就完全没有作用。

于 2012-11-24T20:06:15.490 回答
1

静态字段对象的构造函数只被调用一次,在第一次访问该字段之前的某个时间点。您不应在常规实例构造函数中初始化静态字段。如果他们需要特殊初始化,您应该提供一个静态初始化块,如下所示:

public class Test {
    static int[][] a = new int[20][];
    static {
        for (int i = 0 ; i != 20 ; i++) {
            a[i] = new int[i+1];
        }
    }
}
于 2012-11-24T20:06:07.380 回答
0

加载类时加载静态变量。而且只有一次。根据JLS

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

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

静态变量一直持续到 JVM 关闭。

于 2012-11-24T20:06:43.977 回答