您只能使用带有静态块的静态成员变量。并通知即使您多次调用构造函数,静态块也只会在JVM上运行一次。
为什么我们需要静态块?因为我们不能在构造函数中初始化我们的静态最终成员变量,所以它没有任何意义。
因此,您可以使用构造函数初始化静态变量,因为它们是按实例创建的。你应该在一个静态块中初始化你的静态最终变量。非最终静态成员变量的初始化可以写在静态块中,也可以不写,这是一个选择。您可能希望在创建时在每个实例上初始化相同的值,然后在构造函数中分配静态变量以重置静态变量。如果你只想设置一次静态变量,那么即使它不是最终成员变量,那么你必须在静态块内编写init语句。
这是一个简单的演示;
A - 具有静态初始化块的示例模型类
public class SampleModel {
private int index; // Will be init within the constructor
private static final int MAX_VALUE; // Will be init within static block
private static String messageOfTheDay; // Will be init within static block
// Argument Constructor
public SampleModel(int index) {
this.index = index;
System.out.println("Constructor called");
}
// static block, will be run only once!
static {
System.out.println("WARNING: Static Block called !");
MAX_VALUE = 69;
messageOfTheDay = "I'm here";
}
public String getMessageOfTheDay() {
return messageOfTheDay;
}
public int getMaxValue() {
return MAX_VALUE;
}
public int getIndex() {
return index;
}
}
B - 演示代码
public class StaticBlockDemo {
public static void main(String[] args) {
SampleModel obj1 = new SampleModel(1);
SampleModel obj2 = new SampleModel(2);
SampleModel obj3 = new SampleModel(3);
System.out.println();
System.out.println( "obj1 : index : " + obj1.getIndex() );
System.out.println( "obj1 : Max Value: " + obj1.getMaxValue() );
System.out.println( "obj1 : Max MOTD : " + obj1.getMessageOfTheDay() + "\n");
System.out.println( "obj2 : index : " + obj2.getIndex() );
System.out.println( "obj2 : Max Value: " + obj2.getMaxValue() );
System.out.println( "obj2 : Max MOTD : " + obj2.getMessageOfTheDay() + "\n");
System.out.println( "obj3 : index : " + obj3.getIndex() );
System.out.println( "obj3 : Max Value: " + obj3.getMaxValue() );
System.out.println( "obj3 : Max MOTD : " + obj3.getMessageOfTheDay() + "\n");
}
}
C - 输出
WARNING: Static Block called !
Constructor called
Constructor called
Constructor called
obj1 : index : 1
obj1 : Max Value: 69
obj1 : Max MOTD : I'm here
obj2 : index : 2
obj2 : Max Value: 69
obj2 : Max MOTD : I'm here
obj3 : index : 3
obj3 : Max Value: 69
obj3 : Max MOTD : I'm here
通知在输出中,构造函数被调用了 3 次,但是静态块只被调用了一次。