86

可能重复:
静态初始化块

考虑以下代码

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

我们知道首先会执行静态块,然后是块。但问题是我一直无法理解块的真正用途。任何人都可以举一个真实的例子,其中 -

  • 静态块和块都在使用
  • 静态块和块都有不同的实用程序
4

2 回答 2

114

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

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

请注意,此问题已在 stackoverflow 中多次回答,您最好搜索和查看类似问题及其答案。例如:静态初始化块

于 2012-09-23T06:08:27.667 回答
26

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

1.

public static void main(String[] args) {
    Test t = new Test();
}

2.

public static void main(String[] args) {

}

输出:

1.

静态块
空块

2.

静态块

用通俗的话来说,静态块只会被调用一次,不管你创建了多少该类型的对象。

于 2012-09-23T06:09:41.500 回答