枚举构造函数静态初始化程序

时间:2012-07-20 16:25:08

标签: java

我发现它有枚举的凝灰岩。这是Kathy Siera书中的一个例子:

    public class WeatherTest {

    static Weather w;

    public static void main(String[] args) {
        System.out.print(w.RAINY.count + " " + w.Sunny.count + " ");
    }
}

enum Weather {

    RAINY, Sunny;
    int count = 0;

    Weather() {
        System.out.print("c ");
        count++;
    }
}

输出为c c 1 1.理解。 现在我想如果计数字段是静态的呢?输出是c c 2 2吗? 基于它,我将count变量修改为static。 但是我看到的是: 编译时错误:初始化程序对静态字段的非法引用。

在网上搜索我发现这是Sun的某种环洞,它允许静态方法可以改变静态字段。好的..所以现在我使用静态方法来完成我的工作:

     class WeatherTest {

    static Weather w;

    public static void main(String[] args) {
        System.out.print(w.RAINY.count + " " + w.Sunny.count + " ");
    }
}

enum Weather {

    RAINY, Sunny;

    Weather() {
        System.out.print("c ");
        incr();
    }
    static int count = 0;

    static void incr() {
        count++;
    }
}

令我惊讶的是,我得到了输出:c c 0 0! 在我开枪之前,有人可以向我解释一下这种行为吗?

1 个答案:

答案 0 :(得分:5)

枚举值可以被认为是美化的静态字段(它们在封面下)。

所以,如果你的Weather是一个普通的Java类,那就是这样的:

 class Weather {
   public final static Weather RAINY = new Weather( );
   public final static Weather Sunny = new Weather( );

   static int count = 0;

   Weather( ) {
     System.out.print("c ");
     incr();
   }

   static void incr()
   {
      count++;
   }
 }

您可以看到count被声明为 AFTER 两个枚举值,这意味着在创建两个值后它也已初始化。此外,遇到未初始化的静态变量的每个函数调用都将其视为使用默认值初始化(对于int它是0)。

因为您在incr被正确初始化后从未致电count,所以您会将其值视为0