【问题标题】:Static block vs. initializer block in Java? [duplicate]Java中的静态块与初始化块? [复制]
【发布时间】:2012-09-15 00:48:16
【问题描述】:

可能重复:
Static Initialization Blocks

考虑以下代码

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

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

  • staticempty 块都在使用中
  • staticempty 块都有不同的实用程序

【问题讨论】:

标签: java static-block initialization-block


【解决方案1】:

它们有两个截然不同的目的:

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

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

【讨论】:

  • 另外,需要注意的一点是,静态块对于实例化静态类级变量(将在多个类实例之间共享的变量)非常有用。
  • @Prahalad:好点。谢谢。
  • 匿名初始化器在构造函数期间被调用,而不是在它之前。具体来说,在 super() 调用之后。
  • @EJP:这是非常重要的信息,需要在我的回答中进行修改。 很多感谢指正!!!
  • 非静态块也可用于初始化匿名类的字段,因为它不能有构造函数(匿名)。
【解决方案2】:

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

1.

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

2.

public static void main(String[] args) {

}

输出:

1.

静态方块
空块

2.

静态块

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

【讨论】:

  • OP never been able to understand the *real utility* of an empty block 或静态块。
  • @asgs “真正的效用”是它们的行为不同,正如这个答案所描述的那样。
  • @EJP 对,我猜 OP 都想看到的是一个真实的例子,例如在公共图书馆甚至 JDK 中使用的东西。
  • @arshaji 我刚试过你的例子,我发现第二个例子不执行静态块,除非我实例化它。
  • @arshajii 你能澄清加载类的含义吗?我试图了解何时在没有构造函数的帮助下初始化静态最终变量。我在这里提到了我的疑问:ideone.com/FPIbuR 如果你能帮助我,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多