Какова цель включения java.lang.Object в интерфейс Constant Pool?

Компиляция следующего интерфейса:

package test;

public interface MyInterface {
    public void foo();
}

и проверка скомпилированного кода с помощью javap -v -s test.MyInterface показывает следующие (-s подпись подписей участников):

  Compiled from "MyInterface.java"
public interface test.MyInterface
  SourceFile: "MyInterface.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
  #1 = Class              #7              //  test/MyInterface
  #2 = Class              #8              //  java/lang/Object
  #3 = Utf8               foo
  #4 = Utf8               ()V
  #5 = Utf8               SourceFile
  #6 = Utf8               MyInterface.java
  #7 = Utf8               test/MyInterface
  #8 = Utf8               java/lang/Object
{
  public abstract void foo();
    Signature: ()V
    flags: ACC_PUBLIC, ACC_ABSTRACT
}

Мой вопрос: почему существует java.lang.Object в пуле констант, зная, что интерфейс не наследуется от класса Object?

Также, если я изменил определение интерфейса на:

public interface MyInterface extends Comparable<MyInterface> {
    public void foo();
}

и запустите javap, я получаю следующее:

  Compiled from "MyInterface.java"
public interface test.MyInterface extends java.lang.Comparable<test.MyInterface>
  Signature: #7             // Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>;
  SourceFile: "MyInterface.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  ...

В чем заключается цель включения java.lang.Object в подпись Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>; интерфейса?

Кроме того, если я попытаюсь просмотреть байт-код с помощью инструмента (в частности, JBE), он неверно показывает, что MyInterface имеет java.lang.Object как суперкласс с именем класса java.lang.Object, сохраненным в пуле констант:

JBE screenshot

Примечание: Использование jdk1.7.0_75

Ответ 1

Эта ссылка класса Object в пуле констант является результатом того, как формат файла класса был определен в Спецификация Java VM.

Файл класса состоит из одной структуры ClassFile:

ClassFile {
    u4             magic;  // The Famous 0xCAFEBABE
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    ...
}

Относительно этого super_class этот раздел спецификации JVM имеет значение для вашего интерфейса MyInterface:

super_class

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

По существу, константа java/lang/Object необходима только для заполнения элемента super_class допустимым значением. Все экземпляры Java всегда являются экземплярами базового класса Object, но на этот раз реальный ответ больше связан с тем, как была построена JVM и с конкретными вариантами реализации, а не с самим языком.

Кроме того, как отметил @Holger, этот параграф также стоит упомянуть:

Если значение элемента super_class равно нулю, тогда этот файл класса должен представлять класс Object, единственный класс или интерфейс без прямой суперкласс.

Ответ 2

На самом деле все в Java Object. В Java каждая конструкция является объектом.

Class IS Object
Interface IS Object
Enum IS Object.

Поэтому, когда вы создаете программу Object, автоматически упаковывается. Поскольку *.class может использоваться на другой JVM.

@user43250937 правильно в этом случае .

JVM Spec :

Скомпилированный код, который должен быть запущен виртуальной машиной Java, представлен с использованием не зависящего от оборудования и операционной системы двоичного формата, обычно (но не обязательно), хранящегося в файле, известного как формат файла класса. Формат файла класса точно определяет представление класса или интерфейса, включая такие сведения, как порядок байтов, который может быть принят как данность в формате объектного файла для платформы

Возможно, эта ссылка предоставлена ​​для получения дополнительной информации.

Java-bytecode-fundamentals-using-objects-and-calling-methods

Посмотрите

4:  invokeinterface #5,  1; //InterfaceMethod Job.execute:()Ljava/lang/Object;

Спецификация JVM