2016-04-26 17 views
1

Im folgenden Code können wir beweisen, dass Interfaces statische Klasse und nicht statische Klasse innerhalb deklariert werden können (statische geschachtelte Klasse und innere Klasse). OK, nicht neu. Aber was ist der Unterschied zwischen "verschachtelten" und "inneren" Klassen (innerhalb von Interfaces), wenn die "innere" Klasse eine Instanz ohne eine Instanz der äußeren Klasse haben kann, selbst in den Interface Implementierungen (MyInterfImpl im folgenden Code) ?Was ist der Unterschied zwischen statischen Klassen und nicht statischen Klassen innerhalb von Interfaces?

public class NewTest { 

    public static void main(String[] args) { 

     // OK Compilation Fail on next line, here we can't have an Instance of inner class because we don't have 
     // instance of outer class, nothing strange to me 
     MyClass.MyInner inner = new MyClass.MyInner(); //COMPILE FAIL: must be new MyClass().new MyInner() instead 
     MyClass.MyNested nested = new MyClass.MyNested(); // OK here, its nested 

     MyInterf.MyInner inner2 = new MyInterf.MyInner(); // HERE, MyInner is Inner class, ins't it? 
     MyInterf.MyNested nested2 = new MyInterf.MyNested(); // OK here, its nested 

     MyInterfImpl.MyInner inner3 = new MyInterfImpl.MyInner(); // // HERE, MyInner is Inner class, ins't it? 
     MyInterfImpl.MyNested nested3 = new MyInterfImpl.MyNested(); // // OK here, its nested 

    } 




} 

interface MyInterf{ 

    public static class MyNested{ 

    } // end 

    public class MyInner{ 

    }// 

    // some abstract methods.... 
} 

class MyClass{ 
    public static class MyNested{ 

    } // end 

    public class MyInner{ 

    }// end 
} 

class MyInterfImpl implements MyInterf{ 

} 
+0

Klasse in einer Schnittstelle? common .. AFAIK, 'public' und' static' Modifikatoren sind in einer Schnittstelle überflüssig –

+0

Hallo ich bin mir nicht sicher, ob ich deine Frage richtig verstanden habe, also lass es mich bitte wissen. Der allgemeine Vertrag für die Verwendung von statischen Methoden erfordert nicht das neue Schlüsselwort, das zum Erstellen von Instanzen konzipiert ist. so könnten wir MyClass.MyInner() erwarten; zu funktionieren, aber es wird auch nicht kompilieren, da MyInner nicht statisch ist, und dann sollte es nur mit Instanzen Bereich verfügbar sein, dann wird es wieder funktionieren mit: new MyClass(). MyInner(); Auf der anderen Seite wird neue MyInterf.MyNested() funktionieren, weil Schnittstellen Dinge implizit als statisch deklariert. (wie Thufir auch sagte) Hoffe, dass das hilft –

Antwort

1

Von this answer von Nad Nik:

Ich habe die Linien auf dem Code, auf "Highlight", kommentierte Klassen innerhalb von Schnittstellen sind beide tatsächlich implizit static und public. So MyInterf.MyInner() funktioniert gut, seit MyInterf.MyInner ist eigentlich statisch.

bearbeiten Dank Andreas für in den comment dass MyInterf.MyInner den Hinweis auf eine statische verschachtelte Klasse, keine innere Klasse.

Quelle: Java spec, sec. 9.5

Freund, ich hoffe, Sie sind nicht mit dem Rücken zu allen Türen sitzen. :)

+0

Warum haben Sie nicht stimmen nahe als duplizieren? –

+1

* "Innere Klassen innerhalb von Schnittstellen sind eigentlich implizit statisch" * ist ein Widerspruch in sich. Eine * innere Klasse * ist definiert als eine * nicht-statische verschachtelte Klasse *. "Statisch" bedeutet, dass es keine * innere Klasse * sein kann, sondern eine * geschachtelte Klasse *; genauer gesagt eine * static geschachtelte Klasse *. Siehe [JLS 8.1.3 - Innere Klassen und umschließende Instanzen] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3): An * inner class * ist eine geschachtelte Klasse, die ** nicht ** explizit oder ** implizit als 'statisch' ** deklariert ist. – Andreas

+0

@Andreas aktualisiert - danke! – cxw

Verwandte Themen