通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容:
enum Animals {
DOG("woof"), CAT("meow"), FISH("burble");
String sound;
Animals(String s) { sound = s; }
}
class TestEnum {
static Animals a;
public static void main(String[] args) {
System.out.println(a.DOG.sound + " " + a.FISH.sound);
// the following line is from me
System.out.println(Animals.DOG.sound + " " + Animals.FISH.sound);
}
}
注意:代码编译正常。
我不明白的是为什么我们可以从变量
a
访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于public static final Animals DOG = new Animals(1);
因此,如果它们确实是静态的,为什么我们可以从a
访问它们呢?最后一行是我熟悉的方式。
最佳答案
编写a.DOG
与编写Animal.DOG
相同。也就是说,编译器将用其编译时类型Animal替换变量。它被认为是错误代码,因为它掩盖了它依赖于编译时类型而不是a
的动态类型的事实。