在此代码示例中,static 的用途是什么?

What is the use of static doing in this code sample?

我正在使用 jqGrid 编写一个基本的 webapp 教程,jqGrid 是 jquery 的一个插件,它只在网格中显示数据。我正在关注 this tutorial,但我不明白我的 data 地图声明之后的行中发生了什么。

public class Data {

private static Map<String, List<Person>> data = new HashMap<String, List<Person>>();

static
{
    populateBS217RHData();
    poplateBS18QTData();
}

public List<Person> getData(String postcode)
{
    return data.get(postcode.toUpperCase());        
}

private static void populateBS217RHData()
{
    // do thing
}

private static void poplateBS18QTData()
{
    // do other thing
}

}

我知道 static 关键字的目的是在不实例化 class 的情况下使方法/属性可用,但我真的 "get" 它在这种情况下的作用。

我在 .NET 方面有很多经验,但仅次于 none 和 Java,所以我不太确定这里发生了什么。此语法/用途是否有特殊名称?

它是一个静态初始化器,和per the JLS一样,它是...

... executed when the class is initialized.

它们通常用于从非平凡的多行表达式初始化 static 字段(称为 class 变量)。这就像单个静态函数调用或变量赋值可以在与字段声明相同的行上完成,从而减少代码行数。

那个Java Tutorials > Initializing Fields也讲一下:

A static initialization block is a normal block of code enclosed in braces, { }, and preceded by the static keyword

一个 class 可以有一个或多个。它们按 "left to right" 顺序调用(即在 class 主体中声明的顺序)。

您还可以声明 "instance initialization" 块,它们是相似的,但前面没有 static 关键字 - 它们 运行 每次 class 被实例化。

如果您在 块之后声明字段,则初始化块可能会很棘手。关于读写初始化块中字段的规则取决于字段和块的声明顺序。

坦率地说,首先声明字段更简单,如果您必须使用初始化块,然后再做。

static
{
    populateBS217RHData();
    poplateBS18QTData();
}

这是一个静态块

静态块也称为静态初始化块。静态初始化块是包含在大括号 {} 中并以 static 关键字开头的普通代码块。当 JVM 加载 class.

时执行静态块

一个class可以有任意数量的静态初始化块,它们可以出现在class主体的任何地方。运行时系统保证静态初始化块按照它们在源代码中出现的顺序被调用。

  • 如果静态块中有可执行语句,JVM 将 当 class 加载到时自动执行这些语句 JVM.
static
{
    populateBS217RHData();
    poplateBS18QTData();
}

这是static 初始化块static initialization block 大括号之间的代码将只对驻留的 class 执行一次,即使 class 对象被创建多次。

java中有另一个初始化块,它被称为-实例初始化块,其中static 关键字不存在。 实例初始化块 将针对 class 的每个 object/instance 执行。它就像 class.

的其他实例成员