Значение переменной elvis
фиксируется анонимным внутренним классом.
Только Java (в настоящее время) захватывает переменные по значению . Компилятор требует, чтобы переменная была окончательной, чтобы не было путаницы в том, что будет фактически использоваться при вызове метода run
в новом потоке: если вы изменили значение elvis
после создания нового потока, но до запуская его, что вы ожидаете от него?
Это разница между тем, как замыкания эффективно доступны в C # и Java. См. Мою статью о замыканиях для более подробной информации. Java 7 сделает замыкания более краткими - я не следил за тем, чтобы знать, будет ли какой-либо способ захвата самой переменной, а не определенного значения.