通过阅读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的动态类型的事实。

09-25 16:26
查看更多