Warum kann ich eine Aufzählung anonym unterordnen, aber keine Abschlussklasse?

Dieser Code:

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);
    }
}

druckt:

Ich bin der Wert

Dieser Code:

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";
            }
        });
    }
}

führt zu einem Kompilierungsfehler:

cannot inherit from final HelloWorld.C

Warum könnenE.VALUE erschaffe, was mir als anonym erscheintE Unterklasse, die überschreibttoString Methode, während die Verwendung einer final-Klasse anstelle einer implizit finalen Aufzählung einen Fehler bei der Kompilierung auslöst?

Genauer gesagt, warum kannVALUE alles außer Kraft setzenE? Ich hatte den Eindruck, dass der Code

public enum E {
    VALUE;
}

war ungefähr gleichwertig mit

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

in diesem Fall wäre die anonyme Natur nicht erlaubt.

Was ist der Unterschied? Warum sind Enums besonders?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage