java中static的一点疑惑

发布于 2013-04-25  59.36k 次阅读


写J2SE项目中,无意中发现一个问题:

①
private static PortalSynchScheduleService scheduleService = PortalSynchScheduleService.getInstance();
    private static final String[] tabTitle = new String[] { "序号", "任务名称", "描述说明", "表达式", "激活状态", "更新时间"  };

```java
    ②
    static {
        ApplicationContext context = new FileSystemXmlApplicationContext(new String[] { "/applicationContext.xml" });
        SpringContext sc = SpringContext.init();
        sc.setApplicationContext(context);
    }

```java
    ③
    public static void main(String args[]) {
        scheduleService.doSomething();
    }

Main里scheduleService抛NullPointerException,也就是说,第2步骤没有先执行,正确步骤应该是2->1->3, java 加载(初始化)顺序如下: a.静态块 b.静态变量(如果,没有给该变量显示的赋予初始值,将不会调用) c.静态方法(似乎不会在加载时调用,除非你在静态块中调用它) d.main方法

============以上可能是不对的===================== 《java与模式》P233-P244中似乎说到: 类的初始化 和静态变量 的赋值顺序是不可预料的 现在看来,并不矛盾,上面所说的“java 加载(初始化)顺序”到底是不是正确的?《java与模式》中说“静态变量 的赋值顺序是不可预料的”,应该是指静态变量之间的赋值顺序是不可预料的,但静态块,毫无疑问是先执行的。

====================================================================================================================================================================================================================================================================================================== 而静态变量和static代码块是同级的,谁在前面先执行谁

也就是说,a=b=c -> d