在此代码示例中使用静态做什么用途?

时间:2015-02-04 18:11:23

标签: java oop static

我正在使用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关键字的目的是在不实例化类的情况下使方法/属性可用,但我并非真的&#34;得到&#34;它在这种背景下做了什么。

我有很多使用.NET的经验但是几乎没有使用过Java,所以我不确定这里发生了什么。这个语法/用途是否有特殊名称?

3 个答案:

答案 0 :(得分:4)

它是一个静态初始值设定项,而per the JLS则是......

  

...在初始化类时执行。

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

Java Tutorials > Initializing Fields也谈到了它:

  

静态初始化块是用大括号{}括起来的正常代码块,前面是静态关键字

单个班级可以有一个或多个。它们以“从左到右”的顺序被调用(即类体中的声明顺序)。

您还可以声明“实例初始化”块,它们类似但不以static关键字开头 - 它们在每次实例化类时运行。

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

坦率地说,首先声明字段更简单,如果必须使用初始化块,那么之后就这样做。

答案 1 :(得分:1)

static
{
    populateBS217RHData();
    poplateBS18QTData();
}

这是静态阻止

静态块也称为静态初始化块。静态初始化块是用大括号{}括起来的常规代码块,前面是static关键字。当 JVM 加载类时,将执行静态块。

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

  • 如果静态块中有可执行语句,JVM会 加载类时自动执行这些语句 JVM。

答案 2 :(得分:1)

static
{
    populateBS217RHData();
    poplateBS18QTData();
}

此处为static 初始化块。即使多次创建类对象,放置在静态初始化块的大括号之间的代码也只会对驻留类执行一次。

java中,还有另一个初始化块,称为 - 实例初始化块,其中static关键字不存在。将为该类的每个object/instance执行实例初始化块。它就像一个类的其他实例成员。