предисловие
научилсяJava
все знают,Object
Это родительский класс всех классов. Но если у вас есть такой вопрос, я не писалextends Object
Как это наследует объект по умолчанию?
Итак, сегодня давайте посмотрим, как такой язык программирования, как Java, основанный на виртуальной машине, реализует наследование объекта по умолчанию иJava编译器
иJVM
Как именно это делается?
Унаследовано от проверки объекта
Во-первых, давайте проверим, является ли Object родительским классом для всех классов, и создадим новый класс Java, как показано ниже:
Кроме того, когда класс А наследует класс 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 декомпилировать:
Выполните в командной строке 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.
Вот простой тестовый класс:
JDK 6:
использованная литература:
Как создать новый класс в java, наследующий класс Object по умолчанию:Знайте. Baidu.com/question/12…