Вы можете реализовать java.lang.Object
в Java, и фактический класс, который вы используете, действительно был создан из файла Object.java
, который поставляется с JDK.
Спецификация языка Java® говорит в Глава 8. Классы :
Каждый класс, кроме Object
, является расширением (то есть подклассом) одного существующего класса ( §8.1.4 ) и может реализовывать интерфейсы ( §8.1.5 ).
Таким образом, отсутствие супертипов для Object
исправлено в языке.
Вы можете использовать исходный код вашего эксперимента и попробовать добавить предложение extends
или implements
и увидеть, что компилятор отклонит его.
Когда вы компилируете класс java.lang.Object
, полученный класс файл будет единственным, у которого нет супертипа. См. Спецификацию виртуальной машины Java®, §4.1., Структура ClassFile :
- super_class
Для класса значение элемента super_class
должно быть либо нулем, либо допустимым индексом в таблице constant_pool
. Если значение элемента super_class
не равно нулю, запись constant_pool
в этом индексе должна быть структурой CONSTANT_Class_info
, представляющей прямой суперкласс класса, определенного этим файлом class
. Ни у прямого суперкласса, ни у любого из его суперклассов не может быть установлен флаг ACC_FINAL
в элементе access_flags
его структуры ClassFile
.
Если значение элемента super_class
равно нулю, то это Файл class
должен представлять класс Object
, единственный класс или интерфейс без прямого суперкласса.
Для интерфейса значение элемента super_class
всегда должно быть допустимым индексом в constant_pool
стол. Запись constant_pool
в этом индексе должна быть структурой CONSTANT_Class_info
, представляющей класс Object
.
Таким образом, даже интерфейсы имеют запись для суперкласса в файле класса (указывает на Object
), а файл класса для java.lang.Object
является единственным файлом с нулевой записью для суперкласса.
Когда вы пытаетесь загрузить свою версию класса Object
во время выполнения, вы сталкиваетесь с тем фактом, что вы не можете загрузить классы из пакета java.lang
(или любого класса, полное имя которого начинается с java.
) через путь к классам в целом.
До Java 9 вам нужно было настроить bootstrap путь к классам для включения вашей версии. Начиная с Java 9, класс java.lang.Object
должен принадлежать к java.base
модулю , который загружается в соответствии с особенностями реализации c. Вам нужно будет использовать параметр --patch-module
, чтобы внедрить вашу собственную версию.
Но вы должны быть осторожны с тем, что вы пишете в своей собственной версии. Другие классы и среда возлагают большие надежды на другие классы, и их несоблюдение может нарушить их (плохо).
JLS, §4.3.2. В объекте класса перечислены ожидаемые методы и ссылки на другие главы, которые определяют семантику специального языка для некоторых из них.