java - también - ¿Por qué las clases internas no pueden declarar miembros estáticos?
que clases internas no llevan nombre (4)
Básicamente sólo una decisión arbitraria. no hay razón para que no pueda ser soportada, pero tampoco hay una buena razón para apoyarlo. acaba de declarar el campo estático en la clase externa.
Además, esa cita puede no ser del todo correcta: creo que puede declarar un serialVersionUID estático en una clase interna.
El Tutorial de Java dice que dado que una clase interna está asociada con una instancia de la clase adjunta, esta (la clase interna) no puede definir ningún miembro estático en sí.
Es interesante para mí, ¿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 posiblemente podría compartir con las otras instancias de la misma clase interna? ¿Es esto solo una implementación de las cosas en Java que hay que dar por sentado o algo más?
Eso resultaría en un conflicto de intereses para 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 envolvente antes de que pueda ser instanciada. Una variable 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 la clase externa. ¿Ves donde surge el conflicto de intereses en el argumento? Sin embargo, puede crear una variable miembro estática dentro de una clase interna declarando que la clase interna es estática, lo que significa que la clase interna ya no necesita coexistir con un objeto de clase externa.
public class A {
public static class B {
private static JPanel myJPanel;
}
}
Porque la especificación del lenguaje Java lo dice así :
Una clase interna es una clase anidada que no se declara explícita o implícitamente como estática. Las clases internas no pueden declarar inicializadores estáticos (§8.7) o interfaces de miembros. Las clases internas no pueden declarar miembros estáticos, a menos que sean campos constantes en tiempo de compilación (§15.28).
En cuanto a por qué se especificó de esa manera, no lo sé. Mi conjetura es que las clases internas fueron diseñadas como clases pequeñas de ayuda que deberían ser muy limitadas en complejidad.
Una class
interna no puede declarar campos static
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;
}
}
compilará y funcionará perfectamente
static
campos static
solo se pueden declarar en tipos static
o de nivel superior. Por lo tanto, una variable static
(pura) solo se puede declarar en una class
static
.