Каталоги и файлы не обязательно такие разные. Они обе являются записями в своем родительском каталоге, просто с флагом, указывающим, является ли запись каталогом или нет. Вы можете открыть каталог и прочитать его так же, как если бы это был файл, просто некоторые другие операции с ним возможны - символические ссылки работают точно так же. (Это описание смещено в сторону представления файловой системы Unix, но я думаю, что представление DOS / Windows работает почти так же). В любом каталоге есть набор имен членов, и файловая система применяет ограничение уникальности, согласно которому в каталоге может быть только один член с заданным именем.
Думая об именах методов Java по сравнению с именами полей - в C вы не могли иметь глобальную функцию и глобальную переменную с одинаковыми именами, потому что все символы в объектном файле находятся в одном пространстве имен. Но вы могли бы с C ++, потому что функция "void foo ()" была сопоставлена с искаженным именем символа ("foo__vv" или что-то). Таким образом, это не так, что у них есть отдельное пространство имен, так как ключ к пространству имен отличается для поля «foo» и метода «foo ()». Учитывая то, что вы не можете получить столкновения клавиш, они выглядят как отдельные пространства имен, но действительно ли это так реализовано?