Классы не расширяющие java.lang.Object - PullRequest
4 голосов
/ 28 августа 2009

При создании пользовательского класса в Java вы не указываете его как расширяющий объект. Но все же класс является объектом. Как это работает? Как javac или JVM внедряют все свойства класса в определенный пользователем класс?

Ответы [ 5 ]

12 голосов
/ 28 августа 2009

Если вы на самом деле не пишете extends Object, компилятор вставит его для вас.

РЕДАКТИРОВАТЬ : Очевидно, я вызвал некоторую путаницу по поводу того, происходит ли на самом деле вставка кода. Я не был полностью уверен в себе, поэтому я провел небольшой эксперимент: создайте следующий класс в файле test.java:

public class test {}

и скомпилируйте его, затем запустите

javap -c test

чтобы разобрать байт-код. Посмотри, что получится:

Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

}

Так что да, компилятор действительно фактически вставляет extends java.lang.Object (или эквивалент байт-кода) в класс.

4 голосов
/ 28 августа 2009

Все классы Java неявно расширяют java.lang.Object. Из документации :

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

Вот также ссылка на JVM spec :

Стандартный класс Object является суперклассом (§2.8.3) всех других классов. Переменная типа Object может содержать ссылку на любой объект, независимо от того, является ли он экземпляром класса или массива. Все типы классов и массивов наследуют методы класса Object.

1 голос
/ 28 августа 2009

Ну, это может быть бойкий ответ (мой любимый вид), но он, вероятно, делает то же самое, что и класс, если вы указываете родителя. Разве это не так, как если бы вы писали компилятор?

0 голосов
/ 28 августа 2009

Сказать, что JVM "внедряет" свойства или методы в класс, делает его похожим на то, что компилятор или среда выполнения делает после этого, как если бы файл .class отличался. На самом деле все, что происходит, это то, что когда анализатор видит, что вы не включили базовый класс в extends, он просто делает вид, что вы явно указали Object. С этого момента компилятор обрабатывает его так же, как если бы вы его печатали самостоятельно, а JVM не имеет ни малейшего представления о том, что вы сделали или не указали в исходном коде.

0 голосов
/ 28 августа 2009

Это потому, что все пользовательские типы неявно наследуются от Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...