http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.2
Спецификация говорит:
При определении значения имени (§6.5) учитывается контекст, в котором это имя появляется. Правила §6.5 различают контексты, в которых имя должно обозначать (ссылаться) на пакет (§6.5.3), тип (§6.5.5), переменную или значение в выражении (§6.5.6) или метод (§6.5.7).
Итак, насколько я понимаю, имена могут обозначать только указанные выше объекты, которые не содержат полей.
Похоже, это соответствует утверждениям, сделанным чуть ниже:
Не все идентификаторы в программе являются частью имени. Идентификаторы также используются в следующих случаях:
...
В выражениях доступа к полю (§15.11), где идентификатор стоит после "." токен для обозначения члена объекта, который является значением выражения или ключевого слова super, которое появляется перед "." жетон
...
Итак, мой вопрос: в чем причина такого различия между локальными переменными и полями?