使用Java在类中单独使用静态关键字

时间:2013-07-16 15:40:23

标签: java static

在学习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);
};

您通常可以忽略此功能。键是一个枚举,其他一切都应该是自我解释的。奇怪的是,这段代码完全在任何方法之外,实际上static {}块被声明为某种方法。

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

非常感谢。

3 个答案:

答案 0 :(得分:1)

  

那么,这是什么?

这是一个static initialization block。另请参阅语言规范的8.7

  

它做了什么?

它用于初始化类变量。

  

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

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

  

当程序第一次运行时?

不一定。它在需要之前立即完成,这可能直到程序执行中的其他一点。再次,请参阅specification

  

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

一种用于初始化类变量的特殊方法。它被称为“静态初始化器”。 specification中详细介绍了这些限制。

  

我也想问一些效率,甚至是良好的做法建议,以便使用或避免使用它。

当您需要在示例代码中初始化类变量时,它们在某些情况下很有用;我认为良好使用静态初始化器。

答案 1 :(得分:0)

这些是静态阻止。

StaticInitializer:
    static Block

根据JLS-8.7

  

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

注意:

  

使用类变量,其声明在使用后以文本形式出现有时会受到限制,即使这些类变量在范围内也是如此。有关控制类变量的正向引用的精确规则,请参见§8.3.2.3。

答案 2 :(得分:0)

这是一个static initializer。它是在加载类时执行的(或者是初始化的,确切地说,但是你通常不会注意到它的差异)。

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

请注意,还有instance initializers,它们看起来相同,只是它们没有static关键字。当创建对象的新实例时,除构造函数中的代码外,还会运行

答案取自:here