Интерфейсы наследуются от класса Object в java

Наследуют ли интерфейсы от класса Object в Java?

Если нет, то как мы можем вызвать метод класса объекта в экземпляре интерфейса

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

Ответ 1

Наследуют ли интерфейсы от класса Object в Java?

Нет, они этого не делают. И нет общего "корневого" интерфейса, неявно унаследованного всеми интерфейсами (как в случае с классами). (*)

Если нет, то как мы можем вызвать метод класса объекта на экземпляре интерфейса

Интерфейс неявно объявляет один метод для каждого публичного метода в Object. Таким образом, метод equals неявно объявляется как член в интерфейсе (если он уже не наследует его от суперинтерфейса).

Это подробно объясняется в Спецификации языка Java, § 9.2 Члены интерфейса.

9.2 Члены интерфейса

[...]

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

[...]


Это сообщение было переписано как статья здесь.


(*) Заметим, что понятие быть подтипом не эквивалентно наследованию от: Интерфейсы без супер интерфейса действительно являются подтипами Object (§ 4.10.2. Подтипирование между классами и типами интерфейсов), даже если они не наследуются от Object.

Ответ 2

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

Для интерфейса он всегда указывает на java.lang.Object. Но это не используется ни для чего.

Другой способ взглянуть на это:

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

Здесь листинг (Object) param всегда действителен, что означает, что каждый тип интерфейса является подтипом java.lang.Object.

Ответ 3

Object является супертипом любого интерфейса [1]

Однако интерфейс не имеет значения implements, extends или "inherit from" Object.

JLS имеет специальное предложение для добавления методов Object в интерфейсы [2]

[1] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[2] http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2

Ответ 4

Это потому, что employee e = ... читает, что существует класс, который реализует employee и присваивается переменной e. Каждый класс, реализующий интерфейс, неявно расширяет Object, поэтому, когда вы выполняете e.equals(null), язык знает, что у вас есть класс, являющийся подтипом employee.

JVM проведет проверку выполнения для вашего кода (т.е. throw NullPointerException).

Ответ 5

intreface наследует класс Object, как мы можем получить доступ к методам класса объектов с помощью ссылки на тип интерфейса
Интерфейс не наследует класс Object, но обеспечивает доступ ко всем методам класса Object. Элементы интерфейса:

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

объявляет публичный метод абстрактных членов, соответствующий каждому объявленному в Object классе методе открытого экземпляра.,. Это ошибка времени компиляции, если интерфейс явно объявляет такой метод m в случай, когда m объявлено final в Object.

Теперь ясно, что весь суперинтерфейс имеет метод-член abstract, соответствующий каждому методу экземпляра public, объявленному в Object.
источник: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

Ответ 6

Вы вызываете метод equals объекта, реализующего интерфейс.

Ответ 7

Любой класс, реализующий любой интерфейс, также выводится из Object по определению.

Ответ 8

" Все типы ссылок, наследуемые от java.lang.Object. Классы, перечисления, массивы и - все ссылочные типы."

Цитата из: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Второе предложение должно быть ясным.