Java中的静态块与初始化程序块?

Ans*_*shu 79 java static-block initialization-block

可能重复:
静态初始化块

请考虑以下代码:

public class Test {
    {
        System.out.println("Empty block");
    }
    static {
        System.out.println("Static block");
    }
    public static void main(String[] args) {
        Test t = new Test();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们知道首先执行静态块,然后执行块.但问题是我从来没有能够理解块的实际效用.任何人都可以展示一个真实的例子 -

  • 无论静态正在使用的块
  • 无论静态块具有不同的事业

Hov*_*els 107

他们有两个非常不同的目的:

  • 静态初始化程序块将在加载类时调用,并且无法访问实例变量或方法.根据@Prahalad Deshpande的评论,它通常用于创建静态变量.
  • 另一方面,非静态初始化程序块仅在对象构造上创建,可以访问实例变量和方法,并且(根据@EJP建议的重要更正)将在构造函数的开头调用,之后在调用任何其他后续构造函数代码之前,已调用超级构造函数(显式或隐式).我已经看到它在一个类有多个构造函数时使用,并且需要为所有构造函数调用相同的初始化代码.就像构造函数一样,你应该避免在这个块中调用非final方法.

请注意,在stackoverflow中已经多次回答了这个问题,您可以搜索和查看类似的问题及其答案.例如:static-initialization-blocks

  • 匿名初始值设定项在构造函数中被称为*,而不是在它之前.具体来说,在super()调用之后立即执行. (10认同)
  • 非静态块对于初始化匿名类的字段也很有用,因为它不能具有构造函数(匿名). (7认同)
  • 此外,需要注意的是静态块对于实例化静态类级别变量(将在多个类实例之间共享的变量)非常有用. (3认同)

ars*_*jii 24

只要您的类加载,就会执行静态块.每当您实例化类时,都会执行空块.尝试比较这些:

1.

public static void main(String[] args) {
    Test t = new Test();
}
Run Code Online (Sandbox Code Playgroud)

2.

public static void main(String[] args) {

}
Run Code Online (Sandbox Code Playgroud)

输出:

1.

静态块
空块

2.

静态块

在Layman的话中,无论你创建的那种类型的对象有多少,静态块只会被调用一次.

  • @asgs'真正的实用'是他们的行为不同,正如这个答案所描述的那样. (2认同)