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

dub*_*kkk 2 java static constructor

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

Roh*_*ain 12

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

不要.永远不要初始化构造函数中的静态字段.static字段不是与类的任何实例相关联的字段.它必然会上课.该变量只有一个副本,可以在所有实例中访问.因此,如果您在构造函数中初始化它,那么每次创建实例时,将为每个其他实例重新初始化该字段.

您应该使用static initializer块来初始化静态字段,或者只是在声明的位置初始化它们.

class Demo {
    private static int x;  // Either initialize it here.

    static {   // Or use static initializer block
        x = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用静态实例字段,是每次访问字段时调用的构造函数,

,可以访问静态字段class.加载类时会加载并初始化它们.然后您可以稍后修改它class name,在这种情况下,将对所有实例进行更改.因此,无论何时访问,都不会调用构造函数static field.

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

因此,只要您想访问类的任何字段,构造函数就无法发挥作用.