6
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);
        }
    }
...

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

我从来没有在java中看到过这样的东西(我目前正在学习)。

它有什么用?

一般什么时候使用?

什么时候在程序中执行?

4

6 回答 6

8

这称为静态块,并且只会在初始化期间执行一次。此外,如果有多个静态初始化块,运行时保证它们将按照它们在源代码中出现的顺序被调用。

这是一个很好的解释,带有一些示例代码。 https://www.geeksforgeeks.org/g-fact-79/

于 2011-04-12T12:40:12.393 回答
3

它在加载类时执行一次。在这种特定情况下,它为应用程序设置了一个记录器。

于 2011-04-12T12:31:57.827 回答
3

您只能使用带有静态块的静态成员变量。并通知即使您多次调用构造函数,静态块也只会在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 次,但是静态块只被调用了一次。

于 2016-05-11T02:32:57.123 回答
0

这是一个静态初始化块,在加载类时运行一次。它可用于初始化静态成员变量。

于 2011-04-12T12:34:12.330 回答
0

它是一个静态初始化器,将在类初始化期间执行。如您所见,它允许您在该阶段运行复杂的逻辑,包括异常处理。

于 2011-04-12T12:34:20.087 回答
0

它是一个初始化块,在类加载时调用。

于 2011-04-12T12:34:32.597 回答