静态修饰符和静态块之间的区别
有人向我解释了以下两种说法之间的区别吗?
由代码块初始化的变量:static final
static
private static final String foo;
static { foo = "foo"; }
由赋值初始化的变量:static final
private static final String foo = "foo";
有人向我解释了以下两种说法之间的区别吗?
由代码块初始化的变量:static final
static
private static final String foo;
static { foo = "foo"; }
由赋值初始化的变量:static final
private static final String foo = "foo";
在这个例子中,有一个微妙的区别 - 在你的第一个例子中,没有被确定为编译时常量,所以它不能用作块中的一个案例(也不会内联到其他代码中);在你的第二个例子中,它是。例如:foo
switch
switch (args[0]) {
case foo:
System.out.println("Yes");
break;
}
当被视为常量表达式时,这是有效的,但当它“只是”一个静态的最终变量时,这是有效的。foo
但是,静态初始值设定项块通常在具有更复杂的初始化代码(如填充集合)时使用。
初始化的时间在 JLS 12.4.2 中描述。任何被视为编译时常量的静态最终字段首先初始化(步骤6),然后运行初始值设定项(步骤9);所有初始值设定项(无论是字段初始值设定项还是静态初始值设定项)都按文本顺序运行。
private static final String foo;
static { foo ="foo";}
在装入类并运行静态初始值设定项时初始化 的值。foo
private static final String foo = "foo";
此处,的值将是一个编译时常量。因此,实际上将作为字节码本身的一部分提供。foo
"foo"