Причина, по которой это разрешено, заключается в том, что JLS говорит, что это так.Конкретные разделы, которые это позволяют, это JLS 6.5.6.2 (для member.x
случаев) и JLS 15.11.1 (в обоих случаях).Последний говорит:
Если поле является статическим:
Если поле является непустым конечным полем, то результатом является значениеуказанная переменная класса в классе или интерфейсе, которая является типом первичного выражения.
Если поле не является окончательным или является пустым конечным, и доступ к полю происходит в переменной классаинициализатор (§8.3.2) или статический инициализатор (§8.7), тогда результатом является переменная, а именно указанная переменная класса в классе, который является типом первичного выражения.
Почему это разрешено JLS?
Честно говоря, я не знаю.Я не могу придумать каких-либо веских причин для их разрешения.
В любом случае, использование ссылки или this
для доступа к статической переменной - плохая идея, потому что большинство программистов , вероятно,вводить в заблуждение, полагая, что вы используете поле экземпляра.Это серьезная причина не использовать эту функцию Java.
В первом и втором случаях вы должны ссылаться на переменную как x
или Static.x
, а не member.x
.(Я предпочитаю Static.x
.)