Как класс Java наследует Object по умолчанию?

Java

предисловие

научилсяJavaвсе знают,ObjectЭто родительский класс всех классов. Но если у вас есть такой вопрос, я не писалextends ObjectКак это наследует объект по умолчанию?

Итак, сегодня давайте посмотрим, как такой язык программирования, как Java, основанный на виртуальной машине, реализует наследование объекта по умолчанию иJava编译器иJVMКак именно это делается?

Унаследовано от проверки объекта

Во-первых, давайте проверим, является ли Object родительским классом для всех классов, и создадим новый класс Java, как показано ниже:

Как видно из приведенного выше кода, есть много методов, которые вы можете вызвать после выполнения new MyClass(). В определенном нами классе MyClass есть только один основной метод. Откуда берутся эти методы? Очевидно, они объявлены в Object, поэтому класс MyClass Родительским классом является Object, поэтому общедоступные или защищенные ресурсы класса Object могут использоваться в MyClass.

Кроме того, когда класс А наследует класс MyClass, он также может быть передан методам в Object через точки.Это передача наследования.Например, Object - "отец" MyClass, MyClass - "отец" класса A, а Object является «отцом» класса A. «Дедушка» косвенно наследует Object.

Следовательно, Object является суперклассом, родительским классом всех классов.

предположить возможные причины

понятьJava类是如何默认继承Object的?Причина на самом деле не требует знания деталей реализации JVM. Просто поймите основы этой программы виртуальной машины. Как правило, есть два способа решения проблемы наследования по умолчанию для языков, работающих на виртуальных машинах (таких как Java, C# и т. д.).

Обработка компилятором

При компиляции исходного кода, когда родительский класс явно не указывает наследование, компилятору будет назначен родительский класс по умолчанию (обычно Object), при обработке виртуальной машины в класс, потому что у этого класса есть родительский класс по умолчанию, поэтому , VM по-прежнему будет обрабатываться в соответствии с обычными методами, как и любой другой класс для работы с этим классом. В этом случае, с точки зрения скомпилированного бинарника, все родительские классы будут иметь класс (далее может быть проверено на основе этого).

JVM-процесс

Компилятор по-прежнему компилирует в соответствии с фактическим кодом и не выполняет дополнительную обработку, то есть, если класс явно не наследуется от других классов, скомпилированный код по-прежнему не имеет родительского класса. Затем, когда бинарный код запускается виртуальной машиной, когда она встречает класс без родительского класса, она автоматически будет рассматривать этот класс как подкласс класса Object (как правило, родительским классом по умолчанию для таких языков является Object) .

Заключение о проверке

Как видно из двух вышеприведенных случаев, первый случай — это статья, сделанная на компиляторе, то есть когда нет родительского класса, компилятор автоматически присваивает ему родительский класс во время компиляции. Второй случай — поднять огород на виртуальной машине, то есть родительский класс по умолчанию добавляется виртуальной машиной.

Итак, к какой ситуации относится Java? На самом деле, ответ довольно хороший. Просто найдите инструмент декомпиляции и декомпилируйте файл .class, чтобы узнать, как компилируется компилятор.

Примите вышеуказанный код, например, если первый случай, даже если MyClass нет родителя, а исходный код, потому что компилятор был автоматически добавлен как объект MyClass родительского класса, полученный после перекомпиляции класса MyClass, он наследует Класс объекта. Если это не так, это второй случай.

Так какова фактическая ситуация? Теперь давайте посмотрим на MyClass.class, чтобы увидеть, как это выглядит.

jd-gui декомпилировать:

Используйте инструмент, поставляемый с JDK (javap), для декомпиляции

Выполните в командной строке CMD:javap MyClass>MyClass.txt

Видно, что фактического декомпилированного файла нетextends Object, используя метод исключения, следовательно, второй случай.

Вывод, полученный таким образом, это второй случай, но это действительно так? Почему Интернет все еще говорит, что там декомпилированная версия?extends ObjectСлово?

Проблема с версией JDK?

Думаю, это проблема с версией JDK, поэтому я переключил версию JDK на 7 и декомпилировал с помощью jd-gui и javap.extends Object.

Продолжаю менять версию.Я собирался на официальный сайт Oracle, чтобы скачать JDK 6 в общежитии прошлой ночью, но я не выдержал.Первое, что я сделал после того, как сегодня утром пришел в компанию, это скачал его. Это было очень гладко После установки я переключил версию JDK на JDK 6.

Все еще выполнять в окне CMDjavap MyClass>MyClass.txt, содержимое полученного TXT-файла выглядит следующим образом:

какие? Тем не менее тамextends Object, декомпилированного jd-gui до сих пор нет. То есть класс MyClass, декомпилированный с помощью javap до JDK 6, явно наследует Object, но не после JDK 7; декомпилированная версия jd-gui не существует независимо от версии JDK. Мы используем инструменты, которые поставляются с java.

Суммировать

Это означает, что до JDK 6编译器ручка, после JDK 7虚拟机иметь дело с.

Но подумайте о том, что мы编辑器Метод Lane (IDE) в классе Object может быть указан, когда RBI, на этот раз не включает компилятор и jvm, редакторам известно, что родительский класс MyClass является классом Object, и это потому, что редактор выполняет для нас некоторую интеллектуальную обработку.

【конец】

---------------------------- Продолжение--------------------- - -------

9 августа 2019 г. 10:17:54

Некоторые пользователи сети прокомментировали Zhihu, что мой аргумент был недостаточно строгим, поэтому сегодня я обновлю Nuggets.

Вот простой тестовый класс:

Мы просматриваем файл байт-кода напрямую, переключаемся между разными версиями, компилируем javac и просматриваем файл байт-кода с помощью javap -c.

JDK 6:

JDK 7:
Посмотрите прямо на файл байт-кода, потому что есть комментарии, что декомпиляция может оптимизировать чтение, и это не разрешено для чтения, особенно сторонними инструментами декомпиляции.Этот пользователь сети хорошо сказал, спасибо. Видя это, мы можем сделать вывод, что JDK6 и ранее обрабатываются компилятором, а после JDK6 компилятором не обрабатывается. Если вы спросите, обрабатывается ли это JVM после JDK6? Все, что я могу сказать, это кто еще переместил этот файл, кроме компилятора и JVM? Если нет, то это можно объяснить JVM, но аргументация недостаточно строгая, потому что вы толком не видели в исходниках JVM, где она обрабатывается! Если стремление к строгости (самой реальной), то никак, возможности у автора ограничены, и у него нет возможности и сил зайти в исходники JVM, чтобы узнать, где он обрабатывается. Если кто-то знает или нашел, пожалуйста, прокомментируйте и поделитесь. В то же время поблагодарите пользователя сети за напоминание, спасибо!

использованная литература:

Как создать новый класс в java, наследующий класс Object по умолчанию:Знайте. Baidu.com/question/12…