静态修饰符和静态块之间的区别

2022-08-31 12:14:29

有人向我解释了以下两种说法之间的区别吗?

由代码块初始化的变量:static finalstatic

private static final String foo;
static { foo = "foo"; }

由赋值初始化的变量:static final

private static final String foo = "foo";

答案 1

在这个例子中,有一个微妙的区别 - 在你的第一个例子中,没有被确定为编译时常量,所以它不能用作块中的一个案例(也不会内联到其他代码中);在你的第二个例子中,它是。例如:fooswitch

switch (args[0]) {
    case foo:
        System.out.println("Yes");
        break;
}

当被视为常量表达式时,这是有效的,但当它“只是”一个静态的最终变量时,这是有效的。foo

但是,静态初始值设定项块通常在具有更复杂的初始化代码(如填充集合)时使用。

初始化的时间在 JLS 12.4.2 中描述。任何被视为编译时常量的静态最终字段首先初始化(步骤6),然后运行初始值设定项(步骤9);所有初始值设定项(无论是字段初始值设定项还是静态初始值设定项)都按文本顺序运行。


答案 2
 private static final String foo;
 static { foo ="foo";}

装入类并运行静态初始值设定项初始化 的值。foo

private static final String foo = "foo";

此处,的值将是一个编译时常量。因此,实际上将作为字节码本身的一部分提供。foo"foo"


推荐