Если вы хотите реализовать открытый класс, вы должны реализовать его в файле с тем же именем, что и у этого класса. Один файл может содержать один открытый и, возможно, несколько частных классов. Это полезно, если классы используются только внутри класса public. Кроме того, открытый класс также может содержать внутренние классы.
Хотя хорошо иметь один или несколько закрытых классов в одном исходном файле, я бы сказал, что вместо этого лучше использовать внутренние и анонимные классы. Например, можно использовать анонимный класс для определения класса Comparator внутри открытого класса:
public static Comparator MyComparator = new Comparator() {
public int compare(Object obj, Object anotherObj) {
}
};
Класс Comparator обычно требует отдельного файла, чтобы быть публичным. Таким образом, он связан с классом, который его использует.