Java 可以在静态块中创建对象吗?

Java 可以在静态块中创建对象吗?,java,Java,我对静态块有点困惑。如果我们谈论system.out.println方法,这里系统是一个类,out是引用ID为printstream类的引用变量,它在静态块中声明如何在静态块中创建任何对象,因为静态块总是在类加载时执行,而对象是在运行时创建的。。。 如何区分加载时间和运行时间。静态块 静态块是一个静态初始值设定项(类初始值设定项)。您可以使用它来初始化类或在类加载期间执行一些逻辑。如果删除静态修饰符,则代码块是实例初始值设定项 例如,使用静态初始值设定项,您可以使用db数据初始化映射,以便稍后在

我对静态块有点困惑。如果我们谈论
system.out.println
方法,这里系统是一个类,out是引用ID为
printstream
类的引用变量,它在静态块中声明如何在静态块中创建任何对象,因为静态块总是在类加载时执行,而对象是在运行时创建的。。。 如何区分加载时间和运行时间。

静态块 静态块是一个静态初始值设定项(类初始值设定项)。您可以使用它来初始化类或在类加载期间执行一些逻辑。如果删除静态修饰符,则代码块是实例初始值设定项

例如,使用静态初始值设定项,您可以使用db数据初始化映射,以便稍后在对象实例化期间使用

你可以读到这本书,它很好地解释了这一点

我觉得这句话很有用:

静态块也称为静态初始化块。静态初始化块是一个普通的代码块,用大括号括起来,{},前面有static关键字。以下是一个例子:

一个类可以有任意数量的静态初始化块,它们可以出现在类主体中的任何位置。运行时系统保证按照静态初始化块在源代码中出现的顺序调用它们。别忘了,这段代码将在JVM加载类时执行。JVM将所有这些块组合成一个静态块,然后执行

例如,此代码:

public class StaticExample{
    static {
        System.out.println("This is first static block");
    }

    public StaticExample(){
        System.out.println("This is constructor");
    }

    public static String staticString = "Static Variable";

    static {
        System.out.println("This is second static block and "
                                                + staticString);
    }

    public static void main(String[] args){
        StaticExample statEx = new StaticExample();
        StaticExample.staticMethod2();
    }

    static {
        staticMethod();
        System.out.println("This is third static block");
    }

    public static void staticMethod() {
        System.out.println("This is static method");
    }

    public static void staticMethod2() {
        System.out.println("This is static method2");
    }
}
生成此输出:

This is first static block
This is second static block and Static Variable
This is static method
This is third static block
This is constructor
This is static method2
静态方法(静态块的替代方法) 您可以编写一个私有静态方法来实现同样的功能,使用私有静态方法的一个优点是,如果需要重新初始化类变量,可以在以后重用它们

例如:

class Whatever {
    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

你似乎有点困惑。“类加载”是在运行时发生的事情。
class Whatever {
    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}