当前位置: 首页 > 面试题库 >

JLS中是否有关于静态初始化块执行顺序的保证?

邢思淼
2023-03-14
问题内容

我想知道使用像这样的构造是否可靠:

private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;

static {
    engMessages = new HashMap<String, String> () {{
        put ("msgname", "value");
    }};
    rusMessages = new HashMap<String, String> () {{
        put ("msgname", "значение");
    }};
}

private static Map<String, String> msgSource;

static {
    msgSource = engMessages;
}

public static String msg (String msgName) {
    return msgSource.get (msgName);
}

我是否有可能NullPointerException因为msgSource初始化块将在初始化块之前执行engMessages

(关于我为什么不在msgSource上层init的末尾进行初始化。块:只是味道问题;如果所描述的构造不可靠,我将这样做)


问题答案:

是的,保证静态初始化程序块按文本顺序执行。

从JLS,第12.4.1节:

目的是类或接口类型具有一组初始化器,这些初始化器将其置于一致状态,并且该状态是其他类观察到的第一个状态。
静态初始值设定项和类变量初始值设定项以文本顺序执行
,并且不能引用在类中声明的类变量,这些类的声明在使用后以文本形式出现,即使这些类变量在范围内(第8.3.3节)。此限制旨在在编译时检测大多数循环或格式错误的初始化。

从12.4.2开始:

接下来, 以文本顺序 执行类的类变量初始化器和静态初始化器,或接口的字段初始化器,就好像它们是单个块一样。

不过,就我个人而言,我将所有变量声明放在开头,然后是单个静态初始化程序块。我认为这样做容易得多。



 类似资料:
  • 问题内容: 我正在尝试发现初始化发生的顺序,或者更确切地说,为什么要按此顺序进行初始化的原因。给定代码: 输出: 但是,将的声明移动到初始化块之前会产生: 而且我完全不知道为什么会以这种顺序发生。此外,如果我在的声明中消除了关键字,则init块和构造函数均不会触发。谁能帮我这个忙吗? 问题答案: 我认为您只是缺少JLS的12.4.2节,其中包括: 接下来,以文本顺序执行类的类变量初始化器和静态初始

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 问题内容: Kotlin 中的静态初始化块等效于什么? 我了解Kotlin的设计宗旨是不带静电。我正在寻找具有等效语义的东西-首次加载该类时,代码将运行一次。 我的特定用例是,我想从Android AppCompat库启用DayNight功能,并且说明要求将一些代码放入类的静态初始化块中。 问题答案: 从某种角度看,Kotlin中的s等同于Java类的静态部分。特别是,它们是在首次使用类之前初始化

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺

  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 问题内容: 假设一个项目包含几个类,每个类都有一个静态初始化程序块。这些块以什么顺序运行?我知道在一个类中,这样的块按照它们在代码中出现的顺序运行。我读过所有类都一样,但是我编写的一些示例代码对此表示不同。我使用以下代码: 并得到以下输出: START static - grandparent static - parent static - child instance - grandparen