Некоторые классы в стандартном API Java обрабатываются несколько иначе, чем другие классы. Я говорю о тех классах, которые невозможно реализовать без специальной поддержки со стороны компилятора и / или JVM.
Вот что я сразу придумываю:
Object
(очевидно) у него, между прочим, нет суперкласса.String
поскольку в языке есть специальная поддержка оператора +.Thread
поскольку у него есть этот волшебный метод start (), несмотря на то, что нет инструкции байт-кода, которая «разветвляет» выполнение.
Я полагаю, что все подобные классы так или иначе упомянуты в JLS. Поправьте меня если я ошибаюсь.
Во всяком случае, какие еще существуют такие классы? Есть ли полный список «прославленных классов» в языке Java?
Ответы:
Есть много разных ответов, поэтому я подумал, что было бы полезно собрать их все (и добавить несколько):
Классы
Интерфейсы
Почетные упоминания относятся к:
Примечание: я исключил из списка то, что предоставляет JNI (например, ввод-вывод), потому что вы всегда можете реализовать свой собственный вызов JNI, если бы вы были так склонны. Однако собственные вызовы, которые взаимодействуют с JVM привилегированными способами, отличаются.
Массивы спорны - они наследуют Object, имеют понятную иерархию (Object [] - это супертип String []), но они являются особенностями языка, а не определенным классом сами по себе.
источник
SecurityManager
? Или что-нибудь связанное с отражением или сериализацией?Class
, конечно. Он имеет свои собственные литералы (String
кстати, разделяет его различие ) и является отправной точкой всей этой магии отражения.источник
sun.misc.unsafe - мать всех грязных взломов, ломающих дух языка.
источник
источник
Во всех классах Number есть немного волшебства в виде Autoboxing .
источник
Поскольку были упомянуты важные классы , я упомяну некоторые интерфейсы:
Iterable
Интерфейс (с 1,5) - это позволяет объекту участвовать в цикле Еогеасп:Serializable
Интерфейс имеет особое значение, отличное от стандартного интерфейса. Вы можете определить методы, которые будут учитываться, даже если они не определены в интерфейсе (например,readResolve()
).transient
Ключевое слово языка элемент , который влияет на поведениеSerializable
реализаторов.источник
transient
ключевое словоComparable
ни в чем внутреннем не участвует. Вы могли бы легко написатьNewComparable
и новоеNewArrays.sort(..)
с той же функциональностьюисточник
Массив Java, как в
int[].class
источник
[I
class;) это не класс API.java.lang.ClassLoader
, хотя реальная грязная работа выполняется некоторым не упомянутым подклассом (см. 12.2.1 Процесс загрузки ).источник
Не уверен в этом. Но я не могу придумать способ вручную реализовать объекты ввода-вывода.
источник
В
System
классе есть магия .System.arraycopy
это зацепка в машинном кодено...
источник
Ну, поскольку была упомянута особая обработка assert. Вот еще несколько типов исключений, которые специально обрабатываются jvm:
Исключения не являются специальными, но jvm использует их в особых случаях, поэтому вы не можете реализовать их самостоятельно, не написав свой собственный jvm. Я уверен, что есть и другие исключения.
источник
Большинство этих классов на самом деле не реализовано с помощью «специальной» помощи компилятора или JVM. Объект действительно регистрирует некоторые "аборигены", которые исследуют внутренние структуры JVM, но вы также можете сделать это для своих собственных классов. (Я допускаю, что это зависит от семантики, «вызовы нативного кода, определенного в JVM» можно рассматривать как специальную поддержку JVM.)
Что / является / особенным, так это поведение инструкций new и throw в том, как они инициализируют эти внутренние структуры.
Однако аннотации и цифры в значительной степени причудливы.
источник