2011-12-18 20 views
21

El Tutorial de Java dice que dado que una clase interna está asociada con una instancia de la clase envolvente, no puede definir miembros estáticos (la clase interna).¿Por qué las clases internas no pueden declarar miembros estáticos?

Me resulta interesante por qué las clases internas no pueden declarar miembros estáticos, por ejemplo, algún campo private static, que la instancia de esta clase interna podría compartir posiblemente con las otras instancias de la misma clase interna? ¿Es solo una implementación de cosas en Java que se debe dar por sentado o algo más?

+1

No sé Java, y para mí es una sorpresa que una clase interna esté asociada a una _instancia_ de la clase externa –

+0

@Armen: una clase interna no estática es realmente como una clase interna "normal" con una clase interna puntero implícito a una instancia de clase externa. –

+0

@ArmenTsirunyan hace unas horas fue una sorpresa para mí también =) ahora estoy pidiendo a algunos questins aquí que llenen los vacíos en la comprensión de los conceptos de Java ... –

Respuesta

6

Básicamente solo una decisión arbitraria. no hay ninguna razón por la cual no pudo ser compatible con, pero tampoco existe realmente ninguna buena razón para que a lo admita. solo declara el campo estático en la clase externa.

también, esa cita puede no ser del todo correcta: creo que puede declarar un SeridVersionUID estático en una clase interna.

+2

Sí, es una restricción de compilación, no algo inherente a la JVM. Las clases internas son un gran kluge, y realmente no hay distinción entre interior y exterior en el nivel de JVM. –

+0

Más específicamente, puede declarar campos estáticos que son constantes de tiempo de compilación, que debe ser un serialVersionUID. –

+2

¿No es "poner su variable en la clase que lógicamente le pertenece" una buena razón para apoyarlo? –

2

Debido a que el Java Language Specification says so:

Una clase interna es una clase anidada que no es explícita o implícitamente declaró estática. Las clases internas no pueden declarar los inicializadores estáticos (§8.7) o las interfaces de los miembros. Las clases internas no pueden declarar miembros estáticos, a menos que sean campos constantes de tiempo de compilación (§15.28).

En cuanto a por qué se especificó esa manera, no sé. Mi suposición es que las clases internas se diseñaron como clases pequeñas de ayuda que deberían tener una complejidad muy limitada.

+0

¿Resiste esta restricción para las clases internas * estáticas *? –

+1

@pst: por definición, no existe una clase interna estática. Ver la primera oración que cité. –

+0

Err, una * clase anidada estática *. –

-1

Eso daría lugar a un conflicto de intereses al tener una variable miembro estática dentro de una clase interna. En términos generales, una clase interna necesita tener una instancia de objeto de la clase externa o circundante antes de que pueda ser instanciada. Una variable de miembro estática sugiere que ni siquiera necesita una instancia de objeto para esa clase en particular, la clase interna en este caso, pero esa clase de la que depende la clase interna y solo puede coexistir junto con la instancia de clase externa. ¿Ves dónde surge el conflicto de intereses en la discusión? Sin embargo, puede crear una variable miembro estática dentro de una clase interna declarando la clase interna como estática, lo que significa que la clase interna ya no necesita coexistir con un objeto de clase externo.

public class A { 

    public static class B { 

     private static JPanel myJPanel; 

    } 

} 
+2

¿Por qué B declarar un miembro estático de alguna manera significa que no depende de la instancia adjunta de A? Estos parecen ortogonales. –

+0

@ EVAC-Q8R Creo que entiendo lo que quieres decir. para acceder al miembro estático de la clase interna sería algo así como OuterClass ** InstanceName **. InnerClass ** TypeName **. innerClassStaticMemberName que sería definitivamente una mezcla incómoda. Por otro lado, aún es posible acceder a los miembros estáticos a través de una instancia en Java (que normalmente no se requiere). Entonces, ¿por qué no tener esta construcción así: OuterClass ** InstanceName **. New InnerClass(). InnerClassStaticMemberName –

+0

@ Sean - Declaré que la clase interna B "estática" en oposición a la "clase pública B" lo que significa que ya no necesita un objeto circundante para instanciarlo ... no a causa de la instancia estática JPanel myJPanel. –

0

Un interior class no puede declarar static campos a menos que sean constantes en tiempo de compilación. Por lo tanto, si declara el campo static como final, funcionará.

class Foo { 
    class Test { 
     final static int i = 10; 
    } 
} 

se compilar y ejecutar perfectamente

static campos sólo se pueden declarar en static o de nivel superior tipos. Por lo tanto, una variable (pura) static solo puede declararse en un staticclass.

Cuestiones relacionadas