2013-04-27 16 views
10

Warum gibt die JVM-Spezifikation an, dass Schnittstellen eine super_class von java/lang/Object haben müssen, obwohl die Schnittstellen java/lang/Object nicht erweitert werden?Warum erweitern Schnittstellen Object, entsprechend dem Klassendateiformat?

Ich beziehe mich speziell auf §4.1 der JVM-Spezifikation, wo es heißt:

für eine Schnittstelle, der Wert des super_class Element muss immer ein gültiger Index in die constant_pool Tabelle sein. Der Eintrag constant_pool an diesem Index muss eine CONSTANT_Class_info-Struktur sein, die das Klassenobjekt darstellt.

noch in §9.2 der JLS, heißt es, dass Schnittstellen Objekt nicht erweitern. Stattdessen wird eine implizit erstellt abstrakte Methode deklariert, die jede öffentliche Methode in der Objektklasse entspricht:

Wenn eine Schnittstelle keinen direkten Superschnitt hat, dann ist die Schnittstelle deklariert implizit ein öffentlicher abstrakter Member-Methode m mit Unterschrift s, Rückgabetyp r und throws clause t entsprechend jeder öffentlichen Instanzmethode m mit Signatur s, Rückgabetyp r und throws - Klausel t deklariert in Object, es sei denn, eine Methode mit derselben Signatur, demselben Rückgabetyp und einer kompatiblen throws - Klausel wird explizit von der deklariert Schnittstelle.

Antwort

7

Wie in §9.2 erwähnt:

Wenn eine Schnittstelle hat keinen direkten Superschnitt, dann die Schnittstelle deklariert implizit einen öffentlichen abstrakten Member-Methode m mit Unterschrift s, Rückgabetyp r und Klausel t wirft entspricht jeder öffentlichen Instanzmethode m mit Signatur s, Rückgabetyp r und throws-Klausel t in Object deklariert, es sei denn, eine Methode mit derselben Signatur, demselben Rückgabetypund einer kompatiblen throws-Klausel wird explizit vondeklariertdie Schnittstelle.

Daher sehen wir, dass zwar eine Schnittstelle keinen direkten Superschnitt mit nicht explizit erstreckt Object aber noch hat es einen Link mit Object Klasse intern, wie es durch den Compiler verwendet wird, abstrakte Methoden mit derselben Signatur einzufügen und Rückgabetyp und throws-Klausel als die der öffentlichen Methoden in Object Klasse, innerhalb der Schnittstelle. Deshalb muss der Wert des Elements super_class für eine Schnittstelle immer ein gültiger Index in der Tabelle constant_pool sein. Der Eintrag constant_pool an diesem Index muss eine CONSTANT_Class_info-Struktur sein, die die Klasse Object darstellt. Aus diesem Grund kann eine Schnittstellenreferenzvariable erfolgreich öffentliche Instanzmethoden aufrufen, z. B. toString(), Methode Object. Betrachten wir zum Beispiel den Code unten angegeben:

interface MyInterface 
{} 
public class InterfaceTest implements MyInterface 
{ 
    public static void main(String[] args) 
    { 
     MyInterface mInterface = new InterfaceTest(); 
     System.out.println(mInterface.toString());//Compiles successfully. Although toString() is not declared within MyInterface 
    } 
} 

Der obige Code erfolgreich, obwohl toString() Methode kompiliert (der das Verfahren von Object ist) nicht innerhalb MyInterface erklärt. Der obige Code liefert folgende Ausgabe auf meinem System:

[email protected] 

Die Ausgabe kann von System zu System variieren.

0

Was Sie in der JVM-Spezifikation sehen, ist im Grunde die konkrete Implementierung des von der JLS angegebenen Verhaltens - genau wie Klassen Schnittstellen implementieren und Implementierungsdetails haben.

Verwandte Themen