2009-04-29 14 views
3

So wissen wir alle, dass alle Klassen Objekt implizit erweitern. Wie wäre es mit Schnittstellen? Gibt es eine implizite Superschnittstelle? Ich sage es ist. Der folgende Code kompiliert:implizite Super-Schnittstelle in Java?

java.io.Serializable s1 = null; 
java.io.Serializable s2 = null; 

s1.equals(s2); 

Die equals Methode wird nicht in Serializable deklariert, aber in Objekt. Da Schnittstellen nur andere Schnittstellen erweitern können und Objekt eine Klasse und keine Schnittstelle ist, muss eine implizite Schnittstelle vorhanden sein, die erweitert wird. Und die Object Klasse muss dann implizit diese implizite Schnittstelle implementieren (wow, das war seltsam zu schreiben).

Also, die Frage ist, wie richtig ist das?

+1

Ich bekomme nicht Ihre Behauptung, dass "es einige implizite Schnittstelle geben muss, die erweitert wird". Wie kommen Sie zu dieser Schlussfolgerung aus dem, was wir hier sehen? –

+0

Als eine Randnotiz wird dieser Code eine NullPointerException auslösen, anstatt zu arbeiten. – Powerlord

+0

Ich habe nie gesagt, es würde laufen. Ich sagte ausdrücklich nur, dass es kompilieren würde. –

Antwort

15

Da Schnittstellen nur andere Schnittstellen erweitern können, und Objekt ist eine Klasse, nicht eine Schnittstelle, muss es einige implizite Schnittstelle sein, die erweitert.

No.Unter Berufung auf die Java Language Specification:

Wenn eine Schnittstelle keinen direkten Superschnitt hat, dann die Schnittstelle implizit eine öffentliche abstrakte Mitglied Methode m mit Unterschrift s erklärt, Rückgabetyp r und wirft Klausel t entsprechenden zu jeder öffentlichen Instanz Methode m mit Unterschrift s, Rückgabetyp r, und wirft Klausel t in Objekt deklariert, es sei denn, eine Methode mit der gleichen Signatur, gleicher Rückgabetyp und eine kompatible throws-Klausel ist explizit von der Schnittstelle deklariert. Es ist ein Fehler bei der Kompilierung, wenn die Schnittstelle explizit eine solche Methode m im Fall deklariert, wobei m in Object deklariert ist.

Der Unterschied zwischen diesem und Ihrer „impliziten Superschnittstelle“ ist, dass Object eine Reihe von endgültigen und geschützten Methoden haben, und man kann nicht diese Modifier in einer Schnittstelle.

+0

+1 für die tatsächliche Angabe der Spezifikation. –

7

s1 und s2 sind Objektreferenzen, die sich auf Instanzen von Objekten beziehen, die Serializable implementieren. In Java gibt es keine Schnittstellenreferenz.

So weiß Java, dass, was auch immer diese Objekte sind, sie von java.lang.Object abstammen. Daher ist der obige Code gültig.

0

Wenn Sie erklären, so etwas wie:

java.io.Serializable s1 = null; 

nicht vergessen, dass in Java alles von Object abgeleitet ist. Also hier, Sie sagen nur, dass s1 ist etwas (entweder Object oder eine Klasse erweitert Object), dass implements Serializable. Es gibt keine Magie. Alles in Java ist von Object abgeleitet, ob es explizit ist oder nicht. Somit ist die equals Methode immer verfügbar.

+0

vielleicht fehlt mir etwas, aber wie deklariert man eine Variable "einen Typ deklarieren"? –

+0

OK, ich habe es schlecht formuliert. Lass mich bearbeiten und versuche es erneut. – Eddie

0

Ich glaube nicht, dass es eine super Schnittstelle gibt.

Wenn Sie deklarieren eine Variable wie folgt aus:

java.io.Serializable s1 = null; 

Sie jede Object nicht erstellt haben.

Der Compiler weiß, dass s1 und s2Serializable implementieren und wird steigen von Object, damit es die equals ermöglicht.

Verwandte Themen