Чи успадковуються інтерфейси від класу Object у Java


157

Чи успадковуються інтерфейси від Objectкласу на Java?

Якщо ні, то як ми можемо викликати метод класу об'єктів в екземплярі інтерфейсу

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

interface Employee {
}

56
+1, відмінне запитання.
aioobe

@EJP, технічно кажучи, не має значення, що містить java / io / Serializable.class. Я думаю, ви плутаєте специфікацію Java Lang Spec зі специфікацією JVM.
aioobe

@aioobe Оскільки я не згадував жодної з цих специфікацій, я не розумію вашої точки зору. Serializable- це інтерфейс, найпростіший з можливих; біг javapпо ньому говорить вам, від чого він успадковується; і це продиктовано специфікацією мови Java. Якщо ви думаєте, що JVM Spec потрапляє в нього десь, будь ласка, просвітліть нас.
Маркіз Лорн

2
@EJP, питання стосується мови Java (тобто специфікації мови Java). Те, що коли-небудь містить java / io / Serializable.class, пов'язане з тим, що говорить специфікація JVM. Технічно кажучи, немає гарантії, що між характеристиками двох специфікацій існує відповідність один одному.
aioobe

Я детально розповів про це в недавній публікації блогу .
aioobe

Відповіді:


161

Чи успадковуються інтерфейси від Objectкласу на Java?

Ні, вони ні. І немає спільного «кореневого» інтерфейсу, який явно успадковується всіма інтерфейсами (як у випадку з класами) для цього питання. (*)

Якщо ні, то як ми можемо викликати метод класу об'єктів в екземплярі інтерфейсу

Інтерфейс неявно оголосив один метод для кожного публічного методу в Object. Таким чином, equalsметод неявно оголошується як член в інтерфейсі (якщо тільки він вже не успадковує його від надінтерфейсу).

Це детально пояснено в специфікації мови Java, § 9.2 Члени інтерфейсу .

9.2 Члени інтерфейсу

[...]

  • Якщо інтерфейс не має прямих суперінтерфейсів, тоді інтерфейс неявно оголошує публічний абстрактний метод m з підписом s , тип повернення r та викидає пункт t, відповідний кожному методу публічного екземпляра m з підписом s , типу return r та кидає пункт t оголошено вObject , якщо інтерфейс явно не оголосив метод з тим же підписом, тим самим типом повернення та сумісним застереженням кидків.

[...]


Ця публікація була переписана як стаття тут .


(*) Зауважимо, що поняття бути підтипом не є еквівалентним спадщинам від : Інтерфейси, які не мають супер-інтерфейсу, дійсно є підтипами Object( § 4.10.2. Підтипи між класами та типами інтерфейсів ), хоча вони не успадковують Object.


1
@aioobe Якщо ми реалізуємо будь-який інтерфейс, то чому б нам не дати реалізацію методу "equals" у класі, який реалізує цей інтерфейс. Згідно з моїми концепціями, ми повинні реалізувати методи інтерфейсу в реалізації класу, інакше клас буде абстрактним.
Вікас Мангал

1
Вам не потрібно (повторно) реалізовувати успадковані методи. Погляньте на цей приклад . Іншими словами, рівняння вже визначені та успадковані класу, що реалізує інтерфейс.
aioobe

3
Я зрозумів тут. Але одне питання - навіщо нам це потрібно? Яка різниця мала би, якби методи Objectкласу не були задекларовані в інтерфейсі?
Вікас Мангал

2
Якби у нас цього не було, програма у питанні не збиралася б. Існує equalsметод в Employeeінтерфейсі.
aioobe

1
Це запитання та відповідь все ще нагадує мені, що навіть після досвіду я повинен зосередитися на тому, щоб зробити свої основи міцними.
Ананд j. Каджі

13

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неявно без будь-яких помилок компілятора.
NME

12

Насправді є поле надкласового класу у кожному .classфайлі, включаючи ті, що представляють інтерфейси.

Для інтерфейсу він завжди вказує java.lang.Object. Але це не використовується ні для чого.

Ще один спосіб поглянути на це:

interface MyInterface {
    // ...
}

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

Тут команда (Object) paramзавжди діє, що означає, що кожен тип інтерфейсу є підтипом java.lang.Object.


4
Файл .class є артефактом файлу .java. Аргументувати, чому щось працює в мові Java, дивлячись на отриманий .class файл, - це зворотні міркування.
aioobe

Параметр об'єкта obj = (Object); не кидає помилку компіляції. Але методи MyInterface (загальнодоступні) не є видимими для obj. Тому не можу припустити, що MyInterface - це кожен тип інтерфейсу - підтип java.lang.Object
sabarinathan u

5

Це тому, що employee e = ...читається, що існує клас, який реалізує employee і присвоюється змінній e. Кожен клас, що реалізує інтерфейс, поширює об'єкт неявно, тому, коли ви це робите e.equals(null), мова знає, що у вас є клас, який є підтипом employee.

JVM здійснить перевірку вашого коду (тобто кидок NullPointerException).


Відповіді повинні відповідати умовам іменування.
Lew Bloch

3

Чи інтерфейс успадковує клас 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


0

Будь-який клас, що реалізує будь-який інтерфейс, також походить від Objectвизначення.


0

Msgstr " Довідкові типи успадковуються від 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. Лише класи, перерахунки та масиви.
номер945

Вони його змінили :)
dalvarezmartinez1

Навіть якщо "вони змінили це" (у чому я сумніваюся), підручник може помилитися. Нормативна посилання - це специфікація мови Java (JLS).
Lew Bloch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.