Java基础:没有名称或返回类型的静态函数
我想知道这个无名的静态函数是关于什么的 我在java中从未见过这样的东西(我目前正在学习) 这是干什么用的 通常在什么时候使用Java基础:没有名称或返回类型的静态函数,java,function,static,static-initializer,Java,Function,Static,Static Initializer,我想知道这个无名的静态函数是关于什么的 我在java中从未见过这样的东西(我目前正在学习) 这是干什么用的 通常在什么时候使用 这将在程序中何时执行?加载类时执行一次。在这种特定情况下,它会为应用程序设置一个记录器。这是一个在加载类时运行一次的记录器。它可以用来初始化静态成员变量。它是一个,将在类初始化期间执行。如您所见,它允许您在该阶段运行复杂的逻辑,包括异常处理。它是一个初始化块,在类加载时调用。它被称为静态块,在初始化期间只执行一次。此外,如果存在多个静态初始化块,则运行时将保证按照它们在
这将在程序中何时执行?加载类时执行一次。在这种特定情况下,它会为应用程序设置一个记录器。这是一个在加载类时运行一次的记录器。它可以用来初始化静态成员变量。它是一个,将在类初始化期间执行。如您所见,它允许您在该阶段运行复杂的逻辑,包括异常处理。它是一个初始化块,在类加载时调用。它被称为静态块,在初始化期间只执行一次。此外,如果存在多个静态初始化块,则运行时将保证按照它们在源代码中出现的顺序调用它们 下面是一个非常好的解释,其中包含一些示例代码a。
只能使用带有静态块的静态成员变量。并通知即使多次调用构造函数,静态块也只会在JVM上运行一次 为什么我们需要静态块?因为我们无法初始化构造函数中的静态final成员变量,所以它没有任何意义 因此,您可以使用构造函数初始化静态变量,因为它们是每个实例创建的。您应该在静态块中初始化静态final变量。非最终静态成员变量的初始化可以写在静态块中,也可以不写,这是一种选择。您可能希望在创建时在每个实例上初始化相同的值,然后在构造函数中分配静态变量以重置静态变量。如果只想设置静态变量一次,那么即使它不是最终成员变量,也必须在静态块内编写init语句 这里是一个简单的演示 带有静态初始化块的示例模型类 B-演示代码 C-输出
请注意,在输出中,构造函数被调用了3次,而静态块只被调用了一次。谢谢大家,不需要太多的答案:)链接已失效=(@gismo刚刚添加了一个新链接
public class Main {
public static final Logger LOGGER = Logger.getLogger(Main.class.getName());
static {
try {
LOGGER.addHandler(new FileHandler("errors.log",true));
}
catch(IOException ex) {
LOGGER.log(Level.WARNING,ex.toString(),ex);
}
}
...
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;
}
}
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");
}
}
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