什么是初始化块?

新手上路,请多包涵

我们可以将代码放在构造函数或方法或初始化块中。初始化块有什么用?是不是每个java程序都必须有呢?

原文由 Sumithra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 456
2 个回答

首先,有两种类型的 初始化块

  • 实例初始化块,和
  • 静态初始化块

此代码应说明它们的用法以及它们的执行顺序:

 public class Test {

    static int staticVariable;
    int nonStaticVariable;

    // Static initialization block:
    // Runs once (when the class is initialized)
    static {
        System.out.println("Static initalization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    // Runs each time you instantiate an object
    {
        System.out.println("Instance initialization.");
        nonStaticVariable = 7;
    }

    public Test() {
        System.out.println("Constructor.");
    }

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

印刷:

 Static initalization.
Instance initialization.
Constructor.
Instance initialization.
Constructor.

如果您希望无论使用哪个构造函数都运行某些代码,或者如果您希望对匿名类进行一些实例初始化,则实例初始化块很有用。

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

想添加到@aioobe 的回答

执行顺序:

  1. 超类的静态初始化块

  2. 类的静态初始化块

  3. 超类的实例初始化块

  4. 超类的构造函数

  5. 类的实例初始化块

  6. 类的构造函数。

要记住的另外几点(第 1 点是@aioobe 的回答的重申):

  1. 静态初始化块中的代码将在类加载时执行(是的,这意味着每次类加载只执行一次),在构造类的任何实例之前和调用任何静态方法之前。

  2. 实例初始化块实际上由 Java 编译器复制到类的每个构造函数中。所以每次实例初始化块中的代码都在构造函数中的 代码 之前执行。

原文由 Biman Tripathy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题