Erben Schnittstellen von der Object-Klasse in Java?

157

Erben Schnittstellen von der ObjectKlasse in Java?

Wenn nein, wie können wir dann die Methode der Objektklasse auf der Schnittstelleninstanz aufrufen?

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

interface Employee {
}
Teiche
quelle
56
+1, ausgezeichnete Frage.
Aioobe
@EJP, technisch gesehen spielt es keine Rolle, was java / io / Serializable.class enthält. Ich denke, Sie verwechseln die Java Lang-Spezifikation mit der JVM-Spezifikation.
Aioobe
@aioobe Da ich keine dieser Spezifikationen erwähnt habe, verstehe ich Ihren Standpunkt nicht. Serializableist eine Schnittstelle, die so einfach wie möglich ist; Wenn javapSie darauf laufen , erfahren Sie, wovon es erbt. und das wird durch die Java-Sprachspezifikation vorgegeben. Wenn Sie der Meinung sind, dass die JVM-Spezifikation irgendwo dazu kommt, klären Sie uns bitte auf.
Marquis von Lorne
2
@EJP, die Frage bezieht sich auf die Java-Sprache (dh die Java-Sprachspezifikation). Was auch immer java / io / Serializable.class enthält, hängt mit dem zusammen, was in der JVM-Spezifikation angegeben ist. Technisch gesehen gibt es keine Garantie dafür, dass zwischen den Merkmalen der beiden Spezifikationen eine Eins-zu-Eins-Entsprechung besteht.
Aioobe
Ich habe dies kürzlich in einem Blog-Beitrag erläutert .
Aioobe

Antworten:

161

Erben Schnittstellen von der ObjectKlasse in Java?

Nein, das tun sie nicht. Und es gibt auch keine gemeinsame "Root" -Schnittstelle, die implizit von allen Schnittstellen geerbt wird (wie im Fall von Klassen). (*)

Wenn nein, wie können wir dann die Methode der Objektklasse auf der Schnittstelleninstanz aufrufen?

Eine Schnittstelle deklarierte implizit eine Methode für jede öffentliche Methode in Object . Daher wird die equalsMethode implizit als Mitglied in einer Schnittstelle deklariert (es sei denn, sie erbt sie bereits von einer Superschnittstelle).

Dies wird ausführlich in der Java-Sprachspezifikation, § 9.2 Schnittstellenmitglieder, erläutert .

9.2 Schnittstellenmitglieder

[...]

  • Wenn eine Schnittstelle keine direkten Superschnittstellen hat, deklariert die Schnittstelle implizit eine öffentliche abstrakte Mitgliedsmethode m mit der Signatur s , dem Rückgabetyp r und der Throws-Klausel t , die jeder öffentlichen Instanzmethode m mit der Signatur s , dem Return-Typ r und der Throws-Klausel t entspricht deklariert inObject , es sei denn, eine Methode mit derselben Signatur, demselben Rückgabetyp und einer kompatiblen Throws-Klausel wird von der Schnittstelle explizit deklariert.

[...]


Dieser Beitrag wurde bereits als ein Artikel neu geschrieben hier .


(*) Beachten Sie, dass der Begriff, ein Subtyp von zu sein, nicht dem Erbe von entspricht : Schnittstellen ohne Super-Schnittstelle sind in der Tat Subtypen von Object( § 4.10.2. Subtypisierung zwischen Klassen- und Schnittstellentypen ), obwohl sie nicht von erben Object.

aioobe
quelle
1
@aioobe Wenn wir eine Schnittstelle implementieren, warum geben wir dann nicht die Implementierung der "equals" -Methode in der Klasse an, die diese Schnittstelle implementiert? Nach meinen Konzepten müssen wir die Schnittstellenmethoden bei der Implementierung der Klasse implementieren, sonst ist die Klasse abstrakt.
Vikas Mangal
1
Sie müssen geerbte Methoden nicht (erneut) implementieren. Schauen Sie sich dieses Beispiel an . Mit anderen Worten, equals ist bereits definiert und wird an die Klasse vererbt, die die Schnittstelle implementiert.
Aioobe
3
Ich habe hier verstanden. Aber eine Frage - warum brauchen wir das? Welchen Unterschied hätte es gemacht, wenn die ObjectKlassenmethoden nicht in der Schnittstelle deklariert worden wären?
Vikas Mangal
2
Wenn wir dies nicht hätten, würde das Programm in der Frage nicht kompiliert. Es gibt eine equalsMethode in der EmployeeSchnittstelle.
Aioobe
1
Diese Frage und Antwort erinnert mich immer noch daran, dass ich mich auch nach meiner Erfahrung darauf konzentrieren sollte, meine Grundlagen zu stärken.
Anand j. Kadhi
13

Object ist ein Supertyp einer beliebigen Schnittstelle [1]

Allerdings ist eine Schnittstelle nicht implements, extendsoder, „vererben“ Object .

JLS hat eine spezielle Klausel zum Hinzufügen von ObjectMethoden zu Schnittstellen [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

unwiderlegbar
quelle
Das ist die genaueste Antwort. Sollte der Akzeptierte sein. Beispielsweise java.lang.Objectakzeptiert eine Methode, die a verwendet , auch eine Referenz eines beliebigen Schnittstellentyps. Darüber hinaus können Sie die Schnittstelle Objectimplizit ohne Compilerfehler in eine umwandeln.
nme
12

In jeder .classDatei befindet sich tatsächlich ein Superklassenfeld , einschließlich derer, die Schnittstellen darstellen.

Für eine Schnittstelle zeigt es immer auf java.lang.Object. Aber das wird für nichts verwendet.

Eine andere Sichtweise ist:

interface MyInterface {
    // ...
}

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

Hier ist die Besetzung (Object) paramimmer gültig, was bedeutet, dass jeder Schnittstellentyp ein Subtyp von ist java.lang.Object.

finnw
quelle
4
Die .class-Datei ist ein Artefakt der .java-Datei. Zu argumentieren, warum etwas in der Java-Sprache funktioniert, indem man sich die resultierende .class-Datei ansieht, ist eine rückständige Argumentation.
Aioobe
Objekt obj = (Objekt) param; löst keinen Kompilierungsfehler aus. Die Methoden von MyInterface (public) sind für obj jedoch nicht sichtbar. Daher kann nicht angenommen werden, dass MyInterface jeder Schnittstellentyp ist, der ein Subtyp von java.lang.Object
sabarinathan u
5

Das liegt daran, employee e = ...dass gelesen wird, dass es eine Klasse gibt, die implementiert employee und der Variablen zugewiesen wird e. Jede Klasse, die eine Schnittstelle implementiert, erweitert Object implizit. Wenn Sie dies tun e.equals(null), weiß die Sprache, dass Sie eine Klasse haben, die ein Subtyp von ist employee.

Die JVM führt zur Laufzeit eine Überprüfung Ihres Codes durch (dh einen Wurf NullPointerException).

Buhake Sindi
quelle
Die Antworten sollten den Namenskonventionen entsprechen.
Lew Bloch
3

Wenn die Schnittstelle die Objektklasse erbt, wie können wir über eine Schnittstellentypreferenz auf die Methoden der Objektklasse zugreifen?
Keine Schnittstelle erbt keine ObjectKlasse, bietet jedoch Zugriff auf alle ObjectKlassenmethoden. Die Mitglieder einer Schnittstelle sind:

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

deklariert eine öffentliche abstrakte Mitgliedsmethode, die jeder in der ObjectKlasse deklarierten öffentlichen Instanzmethode entspricht .
Es ist ein Fehler bei der Kompilierung , wenn die Schnittstelle explizit ein solches Verfahren m in dem Fall erklärt , wo m sein deklariert ist finalin Object.

Jetzt ist klar, dass alle Superinterface eine abstractMember-Methode haben, die jeder in publicdeklarierten Instanzmethode entspricht Object.

Quelle: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

Sheo
quelle
0

Jede Klasse, die eine Schnittstelle implementiert, wird Objectper Definition ebenfalls von abgeleitet .

Jabal
quelle
0

" Referenztypen erben alle von java.lang.Object . Klassen, Aufzählungen, Arrays und Schnittstellen sind Referenztypen. "

Zitiert aus: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Zweiter Satz, um klar zu sein.

dalvarezmartinez1
quelle
Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: Es heißt nicht, dass die Schnittstelle von Object erbt. Nur Klassen, Aufzählungen und Arrays.
Nummer 945
Sie haben es geändert :)
Dalvarezmartinez1
Selbst wenn "sie es geändert haben" (was ich bezweifle), kann das Tutorial falsch sein. Die normative Referenz ist die Java Language Specification (JLS).
Lew Bloch