Компиляция следующего интерфейса:
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
, сохраненным в пуле констант:
Примечание: Использование jdk1.7.0_75