本帖最后由 cwc7233 于 2014-08-24 16:45:46 编辑

解决方案 »

  1.   

    这是因为
    public static int counter = 3;
    等价于
    public static int counter;
    static{
      counter = 3;
    }
    你如果把public static int counter=3; 放在static块之后,则是先创建成员变量counter(未赋初值),然后先执行你的counter+=1,后再执行counter=3;
    public class Test {
    public static int counter1 = 3;
    static {
    counter1 = 1;
    counter2 = 1;
    }
    public static int counter2 = 3;
    public static void main(String[] args) {
    System.out.println(Test.counter1);
    System.out.println(Test.counter2);
    }
    }
    你执行一下我写的这个代码,执行的结果是1 3,而不是1 1,你应该就能够理解我说的了。
      

  2.   

    counter+=1是放到static块中的,资料中说static块是在初始化阶段执行的,那么之前的准备阶段应该已经为counter赋了默认的0值啊
      

  3.   

    你把public static int counter=3; 这一行写到静态块上面就行了,你还没有定义就直接引用,仅仅是编译器不认识而已。在类加载的时候确实是静态块最后执行,首先是静态属性赋默认值,其次是静态属性赋初值,也就是说你counter不赋值,也会被默认赋值0的。