Обычно анонимный внутренний класс генерирует конструктор, который принимает значения локальных переменных, на которые ссылается класс анонимного внутреннего класса.Сгенерированный код превращает это:
globalEmp = new Emp() { ... };
в:
globalEmp = new Main$1(stackVar);
Этот конструктор затем копирует значение в скрытые поля внутри сгенерированного анонимного класса.
Другими словами, он создает копию значения .Переменная, из которой получено исходное значение, не имеет значения после этого.
В случае, если вы на самом деле показали, это не понадобится, потому что 10 - это константа - но это general способ захвата переменных.
РЕДАКТИРОВАТЬ: Отвечая на ваше редактирование ...
Переменные должны быть окончательными, чтобы не было путаницы - если вы можете изменить их, некоторые разработчики могут ожидайте любых изменений, которые будут видны в анонимном классе, как они есть в других реализациях замыкания.
Что касается официальной документации по этому вопросу, то самое близкое, что я вижу в спецификации языка Java, это раздел 8.1.3 , хотя в нем не говорится о мотивации различных решений.