Почему я могу анонимно создать подкласс enum, но не последний класс?

Этот код:

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

печатает:

Я ценю

Тем не менее, этот код:

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

приводит к ошибке компиляции:

cannot inherit from final HelloWorld.C

Почему можетE.VALUE создать то, что мне кажется анонимнымE подкласс, переопределяяtoString метод, при использовании финального класса вместо неявно финального перечисления выдает ошибку времени компиляции?

Более конкретно, почему можноVALUE переопределить что-либо вE? У меня сложилось впечатление, что код

public enum E {
    VALUE;
}

был примерно эквивалентен

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

в этом случае анонимный характер не будет разрешен.

Какая разница? Почему перечисления особенные?

Ответы на вопрос(3)

Ваш ответ на вопрос