Ошибка "non-static variable cannot be referenced from a static context" в переопределённом методе перечисления

Есть enum, в котором две константы, три переменные и один метод, из которого есть доступ к private переменной. Для второй константы переопределяю метод, из которого доступа к private переменной уже нет. Вылезает ошибка:

non-static variable b cannot be referenced from a static context

Но к public переменной доступ есть. Не понимаю, почему?

enum MyEnum {
    CONST_1,
    CONST_2 {
        @Override
        public void print() {
            System.out.println(b); // ошибка
            System.out.println(c); // нормально
        }
    };
    private int a;
    private int b;
    public int c;
    public void print() {
        System.out.println(a);
    }
}

Ответы (1 шт):

Автор решения: Nowhere Man

Константы в перечислениях являются по умолчанию public static final.

При переопределении некой константы в перечислении с переопределённым методом будет создан эквивалент вложенного статического класса -- анонимный вложенный класс, унаследованный от данного перечисления MyEnum:

class MyEnum extends Enum<MyEnum> {

    public static final MyEnum CONST_1 = ...; // инициализация вида new MyEnum("CONST_1", 0)

    public static final class MyEnum$1 extends MyEnum {
        @Override
        public void print() {
            System.out.println(b); // ошибка
            System.out.println(c); // нормально
        }
    }

    public static final MyEnum CONST_2 = ...; // new MyEnum$1("CONST_2", 1);
 
    private int a; // не используется в статическом классе-потомке
    private int b;
}

Соответственно, доступ к приватным членам внешнего класса запрещён для вложенных статических классов, каковым является переопределённый элемент перечисления.

Чтобы получить доступ к переменной b, следует либо просто сделать её доступнее, убрав модификатор private или же заменив его на public / protected, либо сослаться на класс-предок при помощи super:

// ...
    CONST_2 {
        @Override
        public void print() {
            System.out.println("b=" + super.b); // ОК!
            System.out.println("c=" + c); // нормально
        }
    };

Подобные вопросы на основном SO:

→ Ссылка