2010-03-20 15 views

Respuesta

7

PUEDE tener un método estático en una clase estática "interna".

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

Para ser preciso, sin embargo, Inner se llama una clase anidada según la terminología JLS (8.1.3):

clases internas pueden heredar miembros estáticos que no son en tiempo de compilación constantes aunque pueden no declararlos. Las clases anidadas que no son clases internas pueden declarar miembros estáticos libremente, de acuerdo con las reglas habituales del lenguaje de programación Java.


Además, es NO exactamente cierto que una clase interna puede tener static final miembros; para ser más precisos, también tienen que ser constantes en tiempo de compilación. El siguiente ejemplo ilustra la diferencia:

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

la razón por la cual en tiempo de compilación constantes están permitidos en este contexto es obvia: se coloca en línea durante el tiempo de compilación.

+0

El tiempo de compilación en el forro es un detalle de implementación. Mucho más significativo es el hecho de que, en los casos en que el código podría usarse legalmente, el comportamiento de un campo estático final que está cargado con una constante no se distingue del comportamiento de un campo de instancia estático que se carga con esa misma constante. El comportamiento correcto de los miembros estáticos de la clase interna no estática sería ambiguo, pero para los campos finales estáticos cargados con constantes, ambas formas posibles de resolver la ambigüedad arrojarían el mismo resultado. – supercat

Cuestiones relacionadas