usar una tipos son metodos los internos cuáles como clases clase anonimas anidadas acceder java static nested-class

java - una - cuáles son los dos tipos de clases anidadas



¿Se puede crear una instancia de una clase anidada estática varias veces? (5)

@polygenelubricants: Pero en general, sí, un tipo anidado estático puede ser instanciado varias veces.

Solo para estar seguro del 100% de eso, extendí tu fragmento:

public class MultipleInner { static class Inner { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } } public static void main(String[] args) { List<Inner> inners = new ArrayList<Inner>(); for (int i = 0; i < 100; i++) { Inner inner = new Inner(); inner.setState(i); inners.add(inner); } for (Inner inner : inners) { System.out.println(inner.getState()); } } }

Y por supuesto el resultado es:

0 1 2 3 . . . 97 98 99

Dado lo que sé de cualquier otro tipo de característica estática de la programación, creo que la respuesta es ''no''. Sin embargo, ver declaraciones como OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); hace que me pregunte.


Es legal El hecho de que la clase interna sea estática te da un beneficio aquí; sus instancias no están vinculadas a ninguna instancia de la clase contenedora, por lo que se pueden crear instancias libremente (siempre que el calificador de acceso lo permita).

Sin embargo, el precio es que la clase interna no puede usar miembros / métodos no estáticos de la clase contenedora.


La clase interna puede usar miembros / métodos no estáticos de contener la clase. Puede usarlos solo a través de una referencia de objeto de la clase adjunta

public class MultipleInner { private int outerstate =10; static class Inner { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } } public static void main(String[] args) { Inner inner = new Inner(); inner.setState(new MultipleInner().outerstate); System.out.println(inner.getState()); }

}

Por lo tanto, la clase interna no tiene que pagar el precio de no poder acceder a los miembros no estáticos de la clase adjunta.


Sí, no hay nada en la semántica de un tipo anidado static que le impida hacer eso. Este fragmento funciona bien.

public class MultipleNested { static class Nested { } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Nested(); } } }

Ver también

Ahora, por supuesto, el tipo anidado puede hacer su propio control de instancia (por ejemplo, constructores private , patrón de singleton, etc.) pero eso no tiene nada que ver con el hecho de que sea un tipo anidado. Además, si el tipo anidado es una static enum , por supuesto, no puede crear una instancia.

Pero en general, sí, un tipo anidado static se puede instanciar varias veces.

Tenga en cuenta que técnicamente, un tipo anidado static no es un tipo "interno".

JLS 8.1.3 Clases internas e instancias adjuntas

Una clase interna es una clase anidada que no se declara explícita o implícitamente como static .

Es decir, según la terminología de JLS, una clase interna es una que no es static . Si es static , entonces es solo un tipo anidado.

Entonces, ¿qué significa static ?

static simplemente significa que el tipo anidado no necesita una instancia del tipo envolvente para ser instanciada.

Ver también


Sí, puedes hacer instancias de ello tantas veces como quieras.

Tal vez la razón por la que ves eso es porque el programa pensó en almacenar una referencia en algún lugar. Aunque estoy de acuerdo contigo parece extraño: S