2017-02-19 46 views
1

Я проходил класс JAVA-документов класса Object и, как мы знаем, Object является базовым классом всех классов. Но мне было интересно, когда класс Object добавлен как суперкласс? Является ли это время компиляции или время выполнения (верьте, что это должно быть во время компиляции)?Когда класс объекта добавлен как суперкласс?

Также, как я прочитал JVM автоматически проверяет, наследует ли класс от родительского класса, тогда он не будет добавлять объект как суперкласс, чтобы избежать проблемы с наследованием-алмазом, но что произойдет в случае абстрактного класса/внутренних классов? Где будет добавлен Суперкласс-объект?

При создании любого нового встроенного объекта в примере HashMap мы видим внутреннюю работу с исходным кодом. Точно так же можно увидеть эту функциональность в любом месте исходного кода Java, или это делается внутренним компилятором?

+0

Возможно, это вопрос [softwareengineering.se]. –

+1

Невозможно, чтобы классовое наследование вводило «проблему с алмазом» в Java, потому что каждый класс, отличный от 'Object', имеет ровно один прямой суперкласс. «Объект» не имеет суперкласса, являющегося корнем всех иерархий классов. В качестве ответа ниже намеки, для любого класса компилятор определяет, когда 'Object' должен быть прямым суперклассом. Вы читали спецификацию языка Java (JLS) или учебник по Java? Они объясняют это, первое в некоторых деталях. Хорошо быть знакомым с документацией и использовать ее. –

+0

@ Dev-iL при обращении к другим сайтам часто бывает полезно указать, что [перекрестная публикация неодобрительно] (http://meta.stackexchange.com/tags/cross-posting/info) – gnat

ответ

5

Если вы не указали суперкласс, по умолчанию - java.lang.Object. И суперкласс определяется на компиляции времени. В случае класса abstract (inner или static), без , явного типа; супер тип - java.lang.Object.

+0

Можно ли увидеть это в любом источнике JVM? или мне нужно проверить classLoaders? – Harish

+0

@Harry 'javap -v' в файле' class', и вы увидите его в байтовом коде. Или вы можете вызвать 'getClass(). GetSuperclass(). GetName()' или прочитать JLS. –

+1

Или вы можете прочитать документацию ... –