Что означает $ в имени переменной?

Недавно я прочитал, что знак $ разрешен в именах переменных Java, но имеет особое значение. К сожалению, не упоминается, что это за особый смысл.

Поэтому я спрашиваю здесь: каково специальное значение $ в именах переменных в Java?

Вот точная цитата из

Java: введение в решение проблем и программирование

от Вальтера Савича:

Java позволяет символу доллара появляться в идентификаторе, но эти идентификаторы имеют особое значение, поэтому вам не следует использовать символ $ в своих идентификаторах.

2 ответа

Решение

$ используется внутренне компилятором для украшения определенных имен. Википедия приводит следующий пример:

public class foo {
    class bar {
        public int x;
    }

    public void zark () {
        Object f = new Object () {
            public String toString() {
                return "hello";
            }
        };
    }
}

Компиляция этой программы даст три файла.class:

  • foo.class, содержащий основной (внешний) класс foo
  • foo$bar.class, содержащий именованный внутренний класс foo.bar
  • foo$1.class, содержащий анонимный внутренний класс (локальный для метода foo.zark)

Все эти имена классов действительны (как $ символы разрешены в спецификации JVM).

В том же духе, javac использования $ в некоторых автоматически генерируемых именах переменных: например, this$0 и др. используются для неявного this ссылки из внутренних классов на их внешние классы.

Наконец, JLS рекомендует следующее:

$ Символ должен использоваться только в механически сгенерированном исходном коде или, редко, для доступа к существующим ранее именам в устаревших системах.

Для этого нет особого значения:

"Имена переменных чувствительны к регистру. Имя переменной может быть любым допустимым идентификатором - последовательность символов Unicode неограниченной длины, начинающаяся с буквы, знака доллара"$"или символа подчеркивания"_". Соглашение однако имена переменных всегда должны начинаться с буквы, а не с "$" или "_". Кроме того, знак доллара, как правило, никогда не используется вообще. В некоторых случаях могут возникать ситуации, когда автоматически генерируемые имена содержат знак доллара, но имена ваших переменных всегда должны избегать его использования. Подобное соглашение существует для символа подчеркивания, хотя технически законно начинать имя переменной с "_", такая практика не рекомендуется. Пробел не разрешен."

Другие вопросы по тегам