Публичные классы верхнего уровня (то есть публичные классы, которые не вложены в другие классы) должны быть определены в файле, который соответствует имени класса. Поэтому код для класса "Foo" должен находиться в "Foo.java".
Из спецификации языка , раздел 7.6 :
Когда пакеты хранятся в файловой системе (§7.2.1), хост-система может выбрать ограничение, что это ошибка времени компиляции, если тип не найден в файле под именем, состоящим из введите имя и расширение (например, .java или .jav), если выполняется одно из следующих условий:
На тип ссылается код в других единицах компиляции пакета, в котором объявлен тип.
Тип объявлен как открытый (и поэтому потенциально доступен из кода в других пакетах).
Это правило, которое не имеет , которому должны следовать компиляторы, в целом соблюдается.