Java基础:没有名称或返回类型的静态函数

Java基础:没有名称或返回类型的静态函数,java,function,static,static-initializer,Java,Function,Static,Static Initializer,我想知道这个无名的静态函数是关于什么的 我在java中从未见过这样的东西(我目前正在学习) 这是干什么用的 通常在什么时候使用 这将在程序中何时执行?加载类时执行一次。在这种特定情况下,它会为应用程序设置一个记录器。这是一个在加载类时运行一次的记录器。它可以用来初始化静态成员变量。它是一个,将在类初始化期间执行。如您所见,它允许您在该阶段运行复杂的逻辑,包括异常处理。它是一个初始化块,在类加载时调用。它被称为静态块,在初始化期间只执行一次。此外,如果存在多个静态初始化块,则运行时将保证按照它们在

我想知道这个无名的静态函数是关于什么的

我在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