Erben Schnittstellen von der Object
Klasse 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 {
}
java
inheritance
interface
Teiche
quelle
quelle
Serializable
ist eine Schnittstelle, die so einfach wie möglich ist; Wennjavap
Sie 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.Antworten:
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). (*)
Eine Schnittstelle deklarierte implizit eine Methode für jede öffentliche Methode in
Object
. Daher wird dieequals
Methode 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 .
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 erbenObject
.quelle
Object
Klassenmethoden nicht in der Schnittstelle deklariert worden wären?equals
Methode in derEmployee
Schnittstelle.Object
ist ein Supertyp einer beliebigen Schnittstelle [1]Allerdings ist eine Schnittstelle nicht
implements
,extends
oder, „vererben“Object
.JLS hat eine spezielle Klausel zum Hinzufügen von
Object
Methoden 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
quelle
java.lang.Object
akzeptiert eine Methode, die a verwendet , auch eine Referenz eines beliebigen Schnittstellentyps. Darüber hinaus können Sie die SchnittstelleObject
implizit ohne Compilerfehler in eine umwandeln.In jeder
.class
Datei 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:
Hier ist die Besetzung
(Object) param
immer gültig, was bedeutet, dass jeder Schnittstellentyp ein Subtyp von istjava.lang.Object
.quelle
Das liegt daran,
employee e = ...
dass gelesen wird, dass es eine Klasse gibt, die implementiertemployee
und der Variablen zugewiesen wirde
. Jede Klasse, die eine Schnittstelle implementiert, erweitert Object implizit. Wenn Sie dies tune.equals(null)
, weiß die Sprache, dass Sie eine Klasse haben, die ein Subtyp von istemployee
.Die JVM führt zur Laufzeit eine Überprüfung Ihres Codes durch (dh einen Wurf
NullPointerException
).quelle
Wenn die Schnittstelle die Objektklasse erbt, wie können wir über eine Schnittstellentypreferenz auf die Methoden der Objektklasse zugreifen?
Keine Schnittstelle erbt keine
Object
Klasse, bietet jedoch Zugriff auf alleObject
Klassenmethoden. Die Mitglieder einer Schnittstelle sind:deklariert eine öffentliche abstrakte Mitgliedsmethode, die jeder in der
Object
Klasse 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
final
inObject
.Jetzt ist klar, dass alle Superinterface eine
abstract
Member-Methode haben, die jeder inpublic
deklarierten Instanzmethode entsprichtObject
.Quelle: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
quelle
Jede Klasse, die eine Schnittstelle implementiert, wird
Object
per Definition ebenfalls von abgeleitet .quelle
" 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.
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.