2010-03-20 11 views

Odpowiedz

7

MOŻESZ mieć metodę statyczną w klasie wewnętrznej "static".

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!" 
    } 
} 

Aby być precyzyjnym, jednak Inner nazywa zagnieżdżone klasy według JLS terminologii (8.1.3):

klasy wewnętrzne mogą dziedziczyć statycznych elementów, które nie są w czasie kompilacji stałych chociaż mogą one nie zadeklaruj ich. Zagnieżdżone klasy, które nie są klasami wewnętrznymi, mogą swobodnie deklarować członków statycznych, zgodnie ze zwykłymi zasadami języka programowania Java.


Ponadto jest NIE dokładnie prawdą, że wewnętrzna klasa może mieć static final członków; aby być bardziej precyzyjnym, muszą one również być stałymi w czasie kompilacji. Poniższy przykład ilustruje różnicę:

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! 
    } 
} 

Powodem czasie kompilacji stałe mogą w związku z tym jest oczywiste: są one wstawiane w czasie kompilacji.

+0

Wstawianie w czasie kompilacji jest szczegółem implementacji. Znacznie ważniejsze jest to, że w przypadkach, gdy kod mógłby legalnie używać, zachowanie końcowego pola statycznego, które jest obciążone stałą, jest nieodróżnialne od zachowania statycznego pola instancji, które jest obciążone tą samą stałą. Właściwe zachowanie statycznych elementów niestatycznej klasy wewnętrznej byłoby niejednoznaczne, ale dla statycznych pól końcowych obciążonych stałymi, oba możliwe sposoby rozwiązania niejednoznaczności dałyby taki sam wynik. – supercat

Powiązane problemy