Есть ли интерфейсы наследовать от класса объекта в Java - PullRequest
143 голосов
/ 19 мая 2011

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

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

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

interface Employee {
}

Ответы [ 7 ]

150 голосов
/ 03 июня 2011

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

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

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

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

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

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

[...]

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

[...]


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


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

11 голосов
/ 19 мая 2011

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

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

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

interface MyInterface {
    // ...
}

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

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

9 голосов
/ 19 мая 2011

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

Однако интерфейс не implements, extends или "не наследуется от" 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 голосов
/ 19 мая 2011

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

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

3 голосов
/ 10 декабря 2011

Является ли интерфейс наследником класса объекта, как мы можем получить доступ к методам класса объекта через ссылку на тип интерфейса
Никакой интерфейс не наследует класс 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 class .
Ошибка времени компиляции, если интерфейс явно объявляет такой метод m в случае где m объявлено как final в Object.

Теперь ясно, что все суперинтерфейсы имеют abstract метод-член, соответствующий каждому public методу экземпляра, объявленному в Object.

Источник: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

0 голосов
/ 23 декабря 2012

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

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

0 голосов
/ 19 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...