静态初始化块

新手上路,请多包涵

据我了解,如果不能在一行中完成,则“静态初始化块”用于设置静态字段的值。

但我不明白为什么我们需要一个特殊的块。例如,我们将一个字段声明为静态的(没有赋值)。然后编写几行代码,为上面声明的静态字段生成并赋值。

为什么我们需要将这些行放在一个特殊的块中,例如: static {...}

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

阅读 892
2 个回答

非静态块:

 {
    // Do Something...
}

每次 构造类的实例时调用。 静态块 只被调用 一次,当类本身被初始化时,不管你创建了多少该类型的对象。

例子:

 public class Test {

    static{
        System.out.println("Static");
    }

    {
        System.out.println("Non-static block");
    }

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

这打印:

 Static
Non-static block
Non-static block

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

如果它们不在静态初始化块中,它们会在哪里?您将如何声明一个仅用于初始化目的的局部变量,并将其与字段区分开来?例如, 想如何编写:

 public class Foo {
    private static final int widgets;

    static {
        int first = Widgets.getFirstCount();
        int second = Widgets.getSecondCount();
        // Imagine more complex logic here which really used first/second
        widgets = first + second;
    }
}

如果 firstsecond 不在一个块中,它们看起来像字段。如果它们在前面没有 static 的块中,那将算作实例初始化块而不是静态初始化块,因此 每个 构造的实例将执行一次而不是总共执行一次。

现在在这种特殊情况下,您可以改用静态方法:

 public class Foo {
    private static final int widgets = getWidgets();

    static int getWidgets() {
        int first = Widgets.getFirstCount();
        int second = Widgets.getSecondCount();
        // Imagine more complex logic here which really used first/second
        return first + second;
    }
}

…但是当您希望在同一个块中分配多个变量时,这不起作用,或者没有(例如,如果您只想记录一些东西 - 或者可能初始化本机库)。

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

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