una otra objetos objeto metodos instanciar dentro crear como clases clase anonimas anidar anidados anidadas anidada java static nested instantiation

otra - ¿Se puede crear una instancia de una clase anidada estática en Java?



crear una clase dentro de una clase java (4)

Estás confundiendo lo static con lo abstract . Las clases abstractas no pueden ser instanciadas. static no es un calificador válido para las clases de nivel superior, pero el significado para las clases internas es el que usted citó.

De los tutorials Java de Oracle he encontrado este texto:

Al igual que con los métodos y variables de clase, una clase anidada estática está asociada con su clase externa. Y al igual que los métodos de clase estática, una clase anidada estática no puede referirse directamente a las variables de instancia o los métodos definidos en su clase adjunta, solo puede usarlos a través de una referencia de objeto.

Nota: una clase anidada estática interactúa con los miembros de instancia de su clase externa (y otras clases) al igual que cualquier otra clase de nivel superior. En efecto, una clase anidada estática es conductualmente una clase de nivel superior que se ha anidado en otra clase de nivel superior para conveniencia de empaquetado.

Se accede a las clases anidadas estáticas usando el nombre de la clase adjunta:

OuterClass.StaticNestedClass

Por ejemplo, para crear un objeto para la clase anidada estática, use esta sintaxis:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass ();

Pensé que no es posible crear una instancia de una clase estática, por lo que realmente no entiendo la oración en negrita.

¿Tienes alguna idea de lo que significa?


Las clases anidadas estáticas en sí mismas no son estáticas en absoluto. En java, ninguna clase es estática. La palabra clave estática en clases anidadas estáticas implica que es otro miembro estático de la clase externa. Pero es solo otra clase cruda. Es por eso que podemos instanciar esta clase


Supongo que malinterpretaste un poco la clase estática. Es cierto que no se puede crear una instancia de cada clase e interfaz abstracta, pero sí se puede crear una instancia de una clase estática. Una cosa que debe notar es que cada clase estática es una clase estática anidada . No puede simplemente crear una clase estática, como puede ver: intente crear una nueva clase en eclipse

Una clase estática siempre pertenece a la "clase principal" que la encierra, y la diferencia entre la clase estática y no estática es: puede referirse a la clase estática secundaria como una propiedad estática de la "clase principal":

ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();

pero solo puede hacer referencia a la clase anidada no estática instanciando una clase padre, como esto:

ParentClass parent = new ParentClass(); ParentClass.NestedClass nested = parent.new NestedClass();

La diferencia es como la que existe entre el campo estático y el no estático.


O confunde static con abstract como dice kihero, o está confundiendo el concepto con una clase que tiene métodos static (que es solo una clase que tiene métodos estáticos).

Una clase anidada estática es solo una clase anidada que no requiere una instancia de su clase envolvente. Si está familiarizado con C ++, todas las clases en C ++ son clases "estáticas". En Java, las clases anidadas no son estáticas de forma predeterminada (esta variedad no estática también se denomina "clase interna"), lo que significa que requieren una instancia de su clase externa, que rastrean detrás de las escenas en un campo oculto, pero esto permite que las clases internas se refieran a los campos de su clase adjunta asociada.

public class Outer { public class Inner { } public static class StaticNested { } public void method () { // non-static methods can instantiate static and non-static nested classes Inner i = new Inner(); // ''this'' is the implied enclosing instance StaticNested s = new StaticNested(); } public static void staticMethod () { Inner i = new Inner(); // <-- ERROR! there''s no enclosing instance, so cant do this StaticNested s = new StaticNested(); // ok: no enclosing instance needed // but we can create an Inner if we have an Outer: Outer o = new Outer(); Inner oi = o.new Inner(); // ok: ''o'' is the enclosing instance } }

Muchos otros ejemplos en Cómo instanciar una clase interna no estática dentro de un método estático

De hecho, declaro que todas las clases anidadas están estáticas de forma predeterminada, a menos que necesito acceso específico a los campos de la clase adjunta.