0

在学习 Java 时,我一直在关注一些教程来习惯 libgdx,我在一个让我感兴趣的课程中发现了这段代码:

    static Map<Keys, Boolean> keys = new HashMap<Keys, Boolean>();
static {
    keys.put(Keys.LEFT, false);
    keys.put(Keys.RIGHT, false);
    keys.put(Keys.JUMP, false);
    keys.put(Keys.FIRE, false);
};

您几乎可以忽略此功能。Keys 是一个枚举,其他一切都应该是不言自明的。奇怪的是,这段代码根本就在任何方法之外,实际上那个静态 {} 块被声明为某种方法。

那么,这是什么?它有什么作用?它是否在创建类时执行那段代码?或者程序第一次运行的时候?(毕竟它是静态的)。我只是想知道这种(我们称之为)方法是什么,如果它有名字,以及我在使用它时有什么限制。我还想询问一些效率,甚至是关于是否使用它或避免它的良好实践建议。

非常感谢你。

4

3 回答 3

2

那么,这是什么?

这是一个静态初始化块。另见语言规范的8.7

它有什么作用?

它用于初始化类变量。

它是否在创建类时执行那段代码?

类初始化时。有关何时发生这种情况的详细信息,请参阅语言规范的12.4.1

或者程序第一次运行的时候?

不必要。它在需要它之前立即完成,这可能要等到程序执行中的某个其他点。再次,请参阅规范

我只是想知道这种(我们称之为)方法是什么,如果它有名字,以及我在使用它时有什么限制。

一种用于初始化类变量的特殊方法。它被称为“静态初始化器”。规范中对这些限制进行了相当详尽的介绍。

我还想询问一些效率,甚至是关于是否使用它或避免它的良好实践建议。

当您需要像在示例代码中那样初始化类变量时,它们在某些情况下很有用;我认为这是一个很好的使用静态初始化程序。

于 2013-07-16T15:44:58.287 回答
0

这些是静态块。

StaticInitializer:
    static Block

根据JLS-8.7

类中声明的静态初始化程序在类初始化时执行(第 12.4.2 节)。与类变量的任何字段初始化器(第 8.3.2 节)一起,静态初始化器可用于初始化类的类变量。

笔记 :

有时限制使用在使用后以文本形式出现声明的类变量,即使这些类变量在范围内。有关管理对类变量的前向引用的精确规则,请参见第 8.3.2.3 节。

于 2013-07-16T15:42:13.320 回答
0

它是一个静态初始化器。它在类加载时执行(或初始化,准确地说,但您通常不会注意到差异)。

它可以被认为是一个“类构造函数”。

请注意,还有一些实例初始化程序,它们看起来相同,只是它们没有static关键字。当创建对象的新实例时,除了构造函数中的代码之外,还会运行这些代码。

答案来自:这里

于 2013-07-16T15:43:12.477 回答