Как уже сказал Джейсон Коэн, Спецификация языка Java определяет, что такое юридический идентификатор в разделе 3.8:
"Идентификатор представляет собой последовательность букв Java и цифр Java неограниченной длины,
первый из которых должен быть буквой Java. [...] «Письмо Java» - это символ, для которого метод Character.isJavaIdentifierStart (int) возвращает true. «Буква или цифра Java» - это символ, для которого метод Character.isJavaIdentifierPart (int) возвращает true. "
Это, надеюсь, ответит на ваш второй вопрос. Относительно вашего первого вопроса; Преподаватели и (насколько я помню) преподаватели Java учили меня, что имя класса Java должно быть идентификатором, начинающимся с заглавной буквы A-Z, но я не могу найти надежного источника по этому вопросу. При тестировании с OpenJDK нет никаких предупреждений, когда имена классов начинаются со строчных букв или даже знака $. Однако при использовании $ -sign вы должны его избежать, если вы компилируете из оболочки bash.