有什么区别:
private static Object myVar = new Object();
和
private static Object myVar2;
static{
myVar2 = new Object();
}
在这两种情况下,我最终得到一个已启动的静态变量
答案 0 :(得分:8)
如果初始化静态也可能是最终对象更复杂,则可以更好地使用第二个。
E.g:
static final MyClass something;
static {
Config conf=SettingsManager.getSettings();
MyClass obj=MyClassFactory.getInstance(conf);
obj.setVodoo(true);
something=obj;
}
答案 1 :(得分:6)
在您的示例中没有区别,编译后的字节码将完全或几乎相同。静态初始化器有时很有用,但更常被误用。如果目标是填充单个静态字段,请编写一个静态方法,它返回初始化对象并在静态字段声明中调用该方法。
答案 2 :(得分:1)
如果创建静态对象更复杂,则可以使用静态初始化块。例如,它可能需要调用setter,或者需要设置辅助中间对象。
static {
SomeConfig config = new SomeConfig();
config.setMaxSize(10);
config.setMinSize(1);
YourObject object = new YourObject(config);
}
答案 3 :(得分:0)
两者都与类文件的内容完全相同:
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static {};
Code:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: putstatic #3; //Field myVar2:Ljava/lang/Object;
10: return
}
在任何一种情况下,您都将获得相同的字节码。我通过将以上选项放在Test.java文件中来生成字节码。