Спецификация Java 7: идентификаторы переменных - это имена, а имена полей - нет? Почему?

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, которое появляется перед "." жетон

  • ...

Итак, мой вопрос: в чем причина такого различия между локальными переменными и полями?


person dsplynm    schedule 25.05.2014    source источник
comment
Вы читали следующий пример и объяснение, которое к нему прилагается?   -  person assylias    schedule 25.05.2014
comment
Да и меня это только больше запутало. Если бы вы могли точно определить, как это отвечает на мой вопрос, это было бы здорово!   -  person dsplynm    schedule 25.05.2014


Ответы (1)


Важная часть:

Правила §6.5 различают контексты, в которых имя должно обозначать (относиться) к пакету (§6.5.3), типу (§6.5.5), переменной или значению в выражении (§6.5.6). ) или метод (§6.5.7).

Ссылка на поле является также именем в этом контексте, потому что это значение в выражении. (§6.5.6)

Есть много моментов, в которых это объясняется в §6.5.6, я выделил некоторые из них жирным шрифтом ниже:

6.5.6.1. Простые имена выражений

Если имя выражения состоит из одного идентификатора, то должно быть ровно одно объявление, обозначающее локальную переменную, параметр или видимое поле (§6.4.1) в точке, в которой встречается идентификатор. В противном случае возникает ошибка времени компиляции.

Если объявление обозначает переменную экземпляра (§8.3), имя выражения должно появиться в объявлении метода экземпляра (§8.4), конструктора (§8.8), инициализатора экземпляра (§8.6) или инициализатор переменной экземпляра (§8.3.2.2).

[...]

6.5.6.2. Полные имена выражений

Если имя выражения имеет форму Q.Id, то Q уже классифицирован как имя пакета, имя типа или имя выражения.

[...]

Если Q — имя выражения, пусть T будет типом выражения Q:

Если T не является ссылочным типом, возникает ошибка времени компиляции.

Если нет ровно одного доступного (§6.6) члена типа T, который является полем с именем Id, возникает ошибка времени компиляции.

[так далее. так далее.]

person Erwin Bolwidt    schedule 25.05.2014