Символ
$ поставляется с именем класса, когда существует новая безымянная реализация класса.
В первом примере вы создаете новые реализации AnonymousClasses в каждом случае.
AnonymousClasses jonny = new AnonymousClasses(){
@Override
public void sayHello() {
System.out.println("Hey");
}
};
Это похоже на создание объекта подкласса с AnonymousClasses в качестве родительского класса. В этом случае, поскольку для подкласса нет имени, JVM добавляет $ 1 к имени своего родителя, чтобы создать уникальное имя.
Во втором примере вы просто создаете новые объекты той же реализации AnonymousClasses. Это может показаться похожим, но если вы внимательно заметите, каждый раз, когда вы создаете новую реализацию интерфейса GreetingModule, которая передается конструктору AnonymousClasses.
В обоих случаях нет внутреннего класса. В первом примере они являются просто объектами подклассов AnonymousClasses, а во втором случае они являются объектами одного и того же AnonymousClasses.