2012-02-20 109 views
2

考虑一个Java class with static fields only和没有构造:什么时候会静态类初始化?

public class OnlyStatic { 
    static O1 o1 = new o1(); 
    static O2 o2 = new o2(); 

    public static int compute(int whatever) { 
     return o1.foo+o2.bar+whatever; 
    } 
} 

在不同的类,该方法compute被使用,或者通过static import

static import OnlyStatic.compute 
int a = OnlyStatic.compute(3); 

或者直接,假定呼叫者是在相同的封装:

int a = OnlyStatic.compute(3); 

当是01和02的ini tialized?在进口时,还是第一次调用compute()

+0

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44557 – MByD 2012-02-20 13:05:38

回答

5

对象o1o2不适用于您的static上下文,也不会将它们也设置为static

JVMS指出当类初始化

Further

类或接口类型Ť

在类声明的任何静态初始化执行将在第一次出现以下任何一项之前立即初始化:

  • Ť是一个类和Ť被创建的一个实例。
  • T是由声明的类和静态方法T被调用。
  • 分配了T声明的静态字段。
  • 使用由T声明的静态字段,该字段不是常量变量(§4.12.4)。
  • Ť是顶层类,并且断言语句(§14.10)词法嵌套Ť内是执行 。

所以你的情况,当静态方法compute()是第一执行

+0

修复了静态声明。你直接指什么?在进口时,还是第一次打电话? – 2012-02-20 13:08:08

+0

“...不延迟加载”。严格来说这不是真的。 ''OnlyStatic'类是由JVM延迟加载的。但是在加载类时,静态字段会立即初始化。 – 2012-02-20 13:08:38

+0

@ A.H。 - 是在导入时还是方法调用时加载的类? – 2012-02-20 13:11:19