Интерфейсы наследуют от Object
класса в Java?
Если нет, то как мы можем вызвать метод класса объекта на экземпляре интерфейса
public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
java
inheritance
interface
пруды
источник
источник
Serializable
интерфейс, максимально простой; бегjavap
на нем говорит вам, от чего он наследует; и это продиктовано Спецификацией языка Java. Если вы думаете, что JVM Spec где-то входит в это, пожалуйста, просветите нас.Ответы:
Нет, они не И нет никакого общего «корневого» интерфейса, неявно унаследованного всеми интерфейсами (как в случае с классами) в этом отношении. (*)
Интерфейс неявно объявляет один метод для каждого открытого метода в
Object
. Таким образом,equals
метод неявно объявляется как член в интерфейсе (если он уже не наследует его от суперинтерфейса).Это подробно объясняется в Спецификации языка Java, § 9.2 Члены интерфейса .
Этот пост был переписан как статья здесь .
(*) Обратите внимание, что понятие подтипа не эквивалентно наследованию от : Интерфейсы без суперинтерфейса действительно являются подтипами
Object
( § 4.10.2. Подтипирование между типами классов и интерфейсов ), даже если они не наследуются отObject
.источник
Object
класса не были объявлены в интерфейсе?equals
метод поEmployee
интерфейсу.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
источник
java.lang.Object
, также принимает ссылку любого типа интерфейса. Более того, вы можетеObject
неявно приводить интерфейс без какой-либо ошибки компилятора.На самом деле в каждом
.class
файле есть поле суперкласса , включая те, которые представляют интерфейсы.Для интерфейса это всегда указывает на
java.lang.Object
. Но это не используется ни для чего.Еще один способ взглянуть на это:
Здесь приведение
(Object) param
всегда допустимо, что означает, что каждый тип интерфейса является подтипомjava.lang.Object
.источник
Это потому, что
employee e = ...
читает, что есть класс, который реализуетemployee
, и назначается переменнойe
. Каждый класс, который реализует интерфейс, неявно расширяет Object, поэтому, когда вы это делаетеe.equals(null)
, язык знает, что у вас есть класс, который является подтипомemployee
.JVM выполнит проверку вашего кода во время выполнения (например, throw
NullPointerException
).источник
Если интерфейс наследует класс объекта, как мы можем получить доступ к методам класса объекта через ссылку на тип интерфейса.
Нет. Интерфейс не наследует
Object
класс, но он обеспечивает доступ ко всем методамObject
класса. Члены интерфейса:объявляет открытый абстрактный метод-член, соответствующий каждому общедоступному методу экземпляра, объявленному в
Object
классе .Это ошибка времени компиляции, если интерфейс явно объявляет такой метод m в случае, когда объявлено, что m находится
final
вObject
.Теперь ясно, что все суперинтерфейсы имеют
abstract
метод-член, соответствующий каждомуpublic
методу экземпляра, объявленному вObject
.источник: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
источник
Любой класс, реализующий любой интерфейс, также является производным от
Object
определения.источник
«Все ссылочные типы наследуются от java.lang.Object . Классы, перечисления, массивы и интерфейсы являются ссылочными типами ».
Цитируется по адресу : http://docs.oracle.com/javase/tutorial/reflect/class/index.html Второе предложение должно быть понятным.
источник
Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types
: это не говорит, что интерфейс наследует от Object. Только классы, перечисления и массивы.