Java 只初始化一次代码

在 Java 中,我们经常使用构造函数来初始化对象的实例变量。每次创建一个对象时,都会调用构造函数来初始化对象的状态。然而,有时我们希望某些代码只在第一次创建对象时执行一次,而不是每次都执行。这就是 Java 中只初始化一次代码的概念。

什么是只初始化一次代码?

只初始化一次代码是指在整个程序运行期间只执行一次的代码。在 Java 中,有两种常用的方式来实现只初始化一次代码:静态代码块和静态变量。

静态代码块

静态代码块是在类加载时执行的一段代码块。它可以用来初始化静态变量和执行其他只需执行一次的操作。静态代码块使用 static 关键字来定义,不接收任何参数。

下面是一个使用静态代码块的示例:

public class InitializationExample {
    private static int count;

    static {
        // 只执行一次的代码
        count = 0;
        System.out.println("静态代码块被执行");
    }

    public InitializationExample() {
        count++;
        System.out.println("对象被创建");
    }

    public static int getCount() {
        return count;
    }

    public static void main(String[] args) {
        InitializationExample example1 = new InitializationExample();
        InitializationExample example2 = new InitializationExample();

        System.out.println("对象数量:" + InitializationExample.getCount());
    }
}

在上面的示例中,静态代码块中的代码只会在类加载时执行一次。而每次创建对象时,构造函数会被调用,但静态代码块不会再次执行。

静态变量

静态变量是在类中声明的变量,它的值对于所有对象实例都是相同的。静态变量使用 static 关键字来定义,并在类加载时进行初始化。

下面是一个使用静态变量的示例:

public class InitializationExample {
    private static int count = 0;

    public InitializationExample() {
        count++;
        System.out.println("对象被创建");
    }

    public static int getCount() {
        return count;
    }

    public static void main(String[] args) {
        InitializationExample example1 = new InitializationExample();
        InitializationExample example2 = new InitializationExample();

        System.out.println("对象数量:" + InitializationExample.getCount());
    }
}

在上面的示例中,静态变量 count 的值对于所有对象实例都是相同的。每次创建对象时,构造函数会被调用并增加计数,但静态变量的值只会在第一次创建对象时初始化一次。

流程图

下面是一个使用 mermaid 语法表示的流程图,展示了只初始化一次代码的执行流程:

flowchart TD
    A(开始)
    B(类加载)
    C(静态代码块初始化)
    D(创建对象)
    E(构造函数调用)
    F(静态代码块不再执行)
    G(结束)

    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    E --> G

总结

在 Java 中,静态代码块和静态变量可以用来实现只初始化一次代码的功能。静态代码块在类加载时执行,并且只执行一次。静态变量的值对于所有对象实例都是相同的,并且只在第一次创建对象时初始化一次。通过合理地使用这些特性,我们可以实现更高效的代码设计。