Почему интерфейсы расширяют Object, в соответствии с форматом файла класса?

Почему спецификация JVM утверждает, что интерфейсы должны иметь super_class от java/lang/Object, даже если интерфейсы не расширяют java/lang/Object?

Я специально ссылаюсь на §4.1 спецификации JVM, где говорится:

Для интерфейса значение элемента super_class всегда должно быть допустимым индексом в таблице constant_pool. Константа_пустой в этом индексе должна быть структурой CONSTANT_Class_info, представляющей объект класса.

еще в §9.2 JLS, он говорит, что интерфейсы не расширяют Object. Вместо этого объявляется неявно созданный абстрактный метод, который соответствует каждому общедоступному методу в классе Object:

Если интерфейс не имеет прямых суперинтерфейсов, тогда интерфейс неявно объявляет открытый метод абстрактных членов m с сигнатурой s, возвращаемым типом r и предложением th, соответствующим каждому методу публичного экземпляра m с сигнатурой s, типом возврата r и throws, объявленный в Object, если только метод с одной и той же сигнатурой, таким же типом возвращаемого значения и предложение совместимого броска явно объявлено интерфейсом.

Ответ 1

Как упоминалось в §9.2:

Если интерфейс не имеет прямых суперинтерфейсов, тогда интерфейс неявно объявляет публичный абстрактный метод-член m с сигнатурой s, тип возврата r и предложение th t, соответствующее каждой публичной метод экземпляра m с сигнатурой s, тип возврата r и предложение throws t объявляется в Object, если только метод с той же подписью, такой же возвращаемый тип, а предложение совместимых бросков явно объявлено интерфейс.

Следовательно, мы видим, что хотя интерфейс, не имеющий прямого суперинтерфейса, явно не расширяет Object, но все же имеет внутреннюю связь с классом Object, поскольку он используется компилятором для вставки абстрактных методов с одинаковой сигнатурой и тип возвращаемого типа и throws как общедоступные методы в классе Object, внутри интерфейса. Вот почему для интерфейса значение элемента super_class всегда должно быть допустимым индексом в таблице constant_pool. Константа_столбца в этом индексе должна быть структурой CONSTANT_Class_info, представляющей класс Объект. Это связано с тем, что ссылочная переменная интерфейса может успешно вызвать методы общего экземпляра, например метод toString() Object. Например, рассмотрите приведенный ниже код:

interface MyInterface
{}
public class InterfaceTest implements MyInterface
{
    public static void main(String[] args) 
    {
        MyInterface mInterface = new InterfaceTest();
        System.out.println(mInterface.toString());//Compiles successfully. Although toString() is not declared within MyInterface
    }
}

Вышеупомянутый код успешно компилируется, хотя метод toString() (который является методом Object) не объявляется внутри MyInterface. Над кодом предоставляется следующий вывод в моей системе:

[email protected]

Выход может отличаться от системы к системе.

Ответ 2

То, что вы видите в спецификации JVM, в основном представляет собой конкретную реализацию поведения, заданного JLS, - так же, как классы реализуют интерфейсы и имеют детали реализации.