枚举构造函数静态初始值设定项



我发现它是凝灰岩,有核。这是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++;
    }
}

输出为c1 1。明白了。现在我想,如果计数字段是静态的呢?输出会是c2吗?在此基础上,我将count变量修改为static。但我看到的是:编译时错误:初始值设定项对静态字段的非法引用。

在网上搜索时,我发现这是Sun的一个环形洞,它允许静态方法改变静态字段。好的…所以现在我使用静态方法incr来完成我的工作:

     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!在我开枪自杀之前,有人能向我解释一下这种行为吗?

枚举值可以被认为是美化的静态字段(它们是隐藏的)。

所以,如果您的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)。

因为在count正确初始化之后,您永远不会调用incr,所以它的值仍然是0

最新更新