5

有什么区别:

private static Object myVar = new Object();

和:

private static Object myVar2;

static{
    myVar2 = new Object();
}

在这两种情况下,我都会得到一个初始化的静态变量

4

4 回答 4

8

如果你的静态对象和最终对象的初始化更复杂,你可以更好地使用第二个。

例如:

static final MyClass something;

static {
    Config conf=SettingsManager.getSettings();
    MyClass obj=MyClassFactory.getInstance(conf);
    obj.setVodoo(true);
    something=obj;
}
于 2012-12-01T13:52:05.460 回答
6

在您的示例中没有区别,编译后的字节码最终将完全相同或几乎相同。静态初始化器有时很有用,但更经常被误用。如果目标是填充单个静态字段,请编写一个返回初始化对象的静态方法并在静态字段声明中调用该方法。

于 2012-12-01T13:54:49.910 回答
1

如果创建静态对象更复杂,您可以使用静态初始化程序块。例如,它可能需要调用 setter,或者在正在设置的辅助中间对象上。

static {
  SomeConfig config = new SomeConfig();
  config.setMaxSize(10);
  config.setMinSize(1);
  YourObject object = new YourObject(config);
}
于 2012-12-01T13:55:37.643 回答
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 文件中来生成字节码。

于 2012-12-01T14:44:30.320 回答