Implizit static deklarierte Klassen?

flashray

Erfahrenes Mitglied
Hallo,

welche sind die implizit static deklarierten Klassen?
JLSpecification hat gesagt.:
An inner class is a nested class that is not explicitly or implicitly declared
static.

Vielleicht Klassen in Interfaces? Oder Klassen in statischen, geschachtelten Klassen? Oder beide?


Vg Erdal
 
Normale eingebettete Klassen kann man nicht von aussen aufrufen und man benötigt immer eine Instanz der Top-Level Klasse um eine Innere Klasse zu instanziieren.

Deklariert man eine eingebettete Klasse als static, so kann man sie wie eine normale Top-Level Klasse benutzen. Sie ist damit eine eingebettete aber keine innere Klasse. Der static Modifier heisst in diesem Fall nicht, dass die Methoden und Felder einer statischen Klasse automatisch auch static sind, sondern nur dass diese Klasse unabhängig von Instanzen der Top-Level Klasse verwendet werden kann.

Ein kleines Beispiel:
Java:
class ProtectedClass {
  public static void testClasses(){
    //compile error: eine innere Klasse kann nur mit einer Instanz aufgerufen werden
    //InnerClass error = new InnerClass();
    //wie hier:
    InnerClass ok = new ProtectedClass().new InnerClass();
    //bei statischen Klassen ist das nicht nötig
    StaticNestedClass works = new StaticNestedClass();
    //von ausserhalb der Klassen ProtectedClass würde man die statische
    //Klasse so aufrufen:
    StaticNestedClass works2 = new ProtectedClass.StaticNestedClass();
  }
  
  class InnerClass {  }
  static class StaticNestedClass { }
}
 
Zuletzt bearbeitet:
Hallo zeja,

alles schön und gut :) . Kannst du mir bitte auch verraten welche der Klassen in deinem Beispiel die implizit static deklarierten geschachtelten Klassen (implicitly static declared nested class) sind ;) ?


Vg Erdal
 
Na die vor der static steht, die StaticNestedClass. Man kann auch gar keine anderen Klassen statisch machen als eingebettete.
 
Zuletzt bearbeitet:
Da bin ich nicht ganz mit Einverstanden!

Schau mal hier:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3

"An inner class is a nested class that is not explicitly or implicitly declared static." -> Eine innere Klasse ist eine geschachtelte Klasse die weder explizit noch implizit static deklariert ist.

Die StaticInnerClass aus deinem Beispiel ist eine geschachtelte, explizit static deklarierte Klasse. Somit ist sie laut JLS Definition keine Innere Klasse. Aus dem gleichen Satz entnehme ich das es weitere geschachtelte Klassen gibt die auch keine Innere Klassen sind. Diese seien aber nicht explizit static deklariert sondern implizit. D.h. obwohl kein static-Modifizierer vorhanden ist, seien irgendwelche Klassen aus dem Kontext heraus implizit static. Aber welche?


Vg Erdal
 
Habe nested und inner ein wenig vertauscht. Habe meine Beiträge entsprechend geändert.

Im selben Artikel steht was implizit als static angesehen wird:
Member interfaces (§8.5) are always implicitly static so they are never considered to be inner classes.
 
Hallo zeja,

"Member interfaces (§8.5) are always implicitly static so they are never considered to be inner classes."
Danke für den Hinweis. D.h. sie haben im anderen Zitat eingebettete Schnittstellen mit implizit statisch welche gemeint.


Das JLS ist irgendwie bescheuert sag ich mal jetz so salopp. Seit wann sind denn Schnittstellen gleichzusetzen mit Klassen, das die uns jetzt verklickern eingebettete Schnittstellen seien keine Innere Klassen.

OK, zu tief in die JLS eintauchen verwirrt einen mehr als es hilft :confused: . Ich bleib lieber überm Wasser bei den offensichtlichen, groben Dingen der Welt.


Vg Erdal
 
Zurück