Dlaczego mogę anonimowo podklasy enum, ale nie klasy końcowej?

Ten kod:

public class Sandbox {
    public enum E {
        VALUE {
            @Override
            public String toString() {
                return "I'm the value";
            }
        };

        @Override
        public String toString() {
            return "I'm the enum";
        }
    }
    public static void main(String[] args) {
        System.out.println(E.VALUE);
    }
}

wydruki:

Jestem wartością

Jednak ten kod:

public class Sandbox {
    public static final class C {
        @Override
        public String toString() {
            return "I'm a C";
        }
    }

    public static void main(String[] args) {
        System.out.println(new C() {
            @Override
            public String toString() {
                return "I'm anonymous";
            }
        });
    }
}

powoduje błąd kompilacji:

cannot inherit from final HelloWorld.C

Dlaczego możeE.VALUE stwórz coś, co wydaje mi się anonimoweE podklasa, przesłaniającatoString metoda, podczas gdy użycie ostatniej klasy zamiast niejawnie końcowego wyliczenia powoduje błąd kompilacji?

Dokładniej, dlaczegoVALUE przesłonić wszystkoE? Miałem wrażenie, że kod

public enum E {
    VALUE;
}

był z grubsza równoważny

public static final class E {
    public static final E VALUE = new E();
}

w takim przypadku anonimowy charakter nie byłby dozwolony.

Co za różnica? Dlaczego są wyjątkowe?

questionAnswers(3)

yourAnswerToTheQuestion