[英]Static initializing block is not working as expected
我有两个类,“Test1”和“Test0”,如此代码所示。
public class Test1 {
public static void main(String...args) {
System.out.print(Test0.randomName);
}
}
public class Test0 {
public static String randomName = initRandomName();
private static String string0;
static {
string0 = "George";
}
private static String initRandomName() {
return "Mr. "+string0;
}
}
我以为它会打印 Mr. George 但它打印 Mr. null。 我不明白发生了什么。 请帮助我。 谢谢你。
JLS 12.4.2详细说明了初始化过程。 特别是:
接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。
换句话说,你可以想象你的Test0
类是这样写的:
public class Test0 {
public static String randomName;
private static String string0;
static {
randomName = initRandomName();
string0 = "George";
}
private static String initRandomName() {
return "Mr. " + string0;
}
}
所以当initRandomName()
被执行时, string0
仍然为空。
您可以将randomName
字段的初始化移动到静态初始化程序之后,如下所示:
class Test0 {
private static String string0;
static {
string0 = "George";
}
public static String randomName = initRandomName();
private static String initRandomName() {
return "Mr. "+string0;
}
}
...但这很脆弱,依靠没有人在不了解影响的情况下重新排序类的成员。
如果你真的需要这样的初始化,我建议声明所有字段而不初始化它们,然后初始化静态初始化块中的所有内容,这样排序就很明显了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.