2010-03-20 4 views

Antwort

7

Sie können statische Methode in einer statischen "inneren" Klasse haben.

Innere Klassen erben können statische Elemente, die nicht einmal kompilieren-Zeitkonstanten sind allerdings können sie:

public class Outer { 
    static String world() { 
     return "world!"; 
    } 
    static class Inner { 
     static String helloWorld() { 
      return "Hello " + Outer.world(); 
     } 
    } 
    public static void main(String args[]) { 
     System.out.println(Outer.Inner.helloWorld()); 
     // prints "Hello world!" 
    } 
} 

Um genau zu sein, ist jedoch Inner eine verschachtelte Klasse nach JLS Terminologie (8.1.3) genannt deklariere sie nicht. Verschachtelte Klassen, die keine inneren Klassen sind, können statische Member frei deklarieren, entsprechend den üblichen Regeln der Programmiersprache Java. Auch


, es ist NICHT genau wahr, dass eine innere Klasse static final Mitglieder haben kann; genauer gesagt, sie müssen auch Kompilierzeit Konstanten sein. Das folgende Beispiel verdeutlicht den Unterschied:

public class InnerStaticFinal { 
    class InnerWithConstant { 
     static final int n = 0; 
     // OKAY! Compile-time constant! 
    } 
    class InnerWithNotConstant { 
     static final Integer n = 0; 
     // DOESN'T COMPILE! Not a constant! 
    } 
} 

Der Grund, warum Konstanten Zeit kompiliert werden in diesem Zusammenhang erlaubt ist offensichtlich: sie werden bei der Kompilierung inlined.

+0

Das Kompilierzeit-In-Lining ist ein Implementierungsdetail. Viel bedeutender ist die Tatsache, dass in Fällen, in denen Code legal verwendet werden könnte, das Verhalten eines statischen Endfelds, das mit einer Konstanten geladen ist, nicht von dem Verhalten eines statischen Instanzfelds zu unterscheiden ist, das mit derselben Konstanten geladen ist. Das richtige Verhalten eines statischen Elements der nicht statischen inneren Klasse wäre mehrdeutig, aber für statische endgültige Felder, die mit Konstanten geladen sind, würden beide Möglichkeiten zur Auflösung der Mehrdeutigkeit dasselbe Ergebnis liefern. – supercat