Я не совсем согласен с ответом @edutesoy.
Первый класс означает, что неявные конструкции преобразуются в явные конструкции, которые можно передавать как любой объект. Классы в Java не являются «первоклассными», они являются зеркалами, где вы можете проверить некоторые свойства, но не самим объектом.
То, что вы не можете изменить структуру класса во время выполнения, это хорошо, например, добавьте поля, измените тело метода или подпись, и с этой точки зрения это частично «только для чтения», это нормально.
Но давайте рассмотрим статические поля. Я думаю, что все согласны с тем, что если final
статические поля не являются изменяемыми, как поля экземпляра В Smalltalk это просто поля, определенные в самом классе, а не в экземплярах класса. Кроме того, в Smalltalk методы на стороне класса полиморфны, как и любой другой метод, и:
aClass field: aValue.
может разрешаться по-разному в зависимости от переданного класса. Это невозможно в Java; на статическое поле или метод необходимо ссылаться через его тип . Это также означает, что он не позволяет переопределять статические методы (подробнее см. Ссылку), как это было бы в случае, если бы они были действительно первого класса.
Тот факт, что отражение в Java возможно, не делает классы "первоклассными" - вы можете только передать представление класса. И вернемся к первоначальному вопросу: я не знаю ни одного статически типизированного языка с первоклассными классами (но мои знания ограничены, возможно, он существует).
EDIT
На самом деле, теперь я помню, что существует StrongTalk (http://www.strongtalk.org/), то есть Smalltalk со статической типизацией. Вопросы типизации обсуждаются в этой статье: Strongtalk: проверка типов Smalltalk в производственной среде