我发现它与枚举很相似。这是 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++;
}
}
输出为 cc 1 1。明白了。现在我想如果计数字段是静态的怎么办?输出会是 cc 2 2 吗?在此基础上,我将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++;
}
}
令我惊讶的是,我得到了输出:cc 0 0!在我开枪之前,谁能向我解释一下这种行为?