写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
Comments | NOTHING