Ответ 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]
Выход может отличаться от системы к системе.