son - Java: Clase interna vs estática
static vs final java (8)
La clase interna estática no puede acceder a los miembros no estáticos de la clase envolvente. Puede acceder directamente a los miembros estáticos (campo y métodos de instancia) de la clase adjunta, al igual que el estilo de procedimiento para obtener valor sin crear un objeto.
La clase interna estática puede declarar tanto miembros estáticos como no estáticos. Los métodos estáticos tienen acceso a los miembros estáticos de la clase principal. Sin embargo, no puede acceder a miembros de clase interna no estáticos. Para acceder a los miembros de la clase interna no estática, debe crear un objeto de la clase interna no estática.
La clase interna no estática no puede declarar campos estáticos y métodos estáticos. Debe declararse en tipos estáticos o de nivel superior. Obtendrá este error al hacerlo diciendo que "los campos estáticos solo se declararán en tipos estáticos o de nivel superior".
La clase interna no estática puede acceder tanto a los miembros estáticos como a los no estáticos de la clase envolvente en el estilo de procedimiento para obtener valor, pero no puede acceder a los miembros de la clase interna estática.
La clase adjunta no puede acceder a los miembros de las clases internas hasta que crea un objeto de clases internas. SI la clase principal al acceder a miembros de una clase no estática puede crear un objeto de una clase interna no estática.
Si la clase principal para acceder a los miembros de la clase interna estática tiene dos casos:
- Caso 1: para miembros estáticos, puede usar el nombre de clase de la clase interna estática
- Caso 2: Para miembros no estáticos, puede crear una instancia de clase interna estática.
Esta pregunta ya tiene una respuesta aquí:
- Clase interna de Java y clase anidada estática 24 respuestas
¿Cuál es la diferencia entre la clase interna estática y no estática?
Discutiendo clases anidadas ...
La diferencia es que una declaración de clase anidada que también es estática puede ser instanciada fuera de la clase envolvente.
Cuando tiene una declaración de clase anidada que no es estática, Java no le permitirá crear instancias, excepto a través de la clase adjunta. El objeto creado fuera de la clase interna está vinculado al objeto creado desde la clase externa, por lo que la clase interna puede hacer referencia a los campos de la clase externa.
Pero si es estático, entonces el enlace no existe, no se puede acceder a los campos externos (excepto a través de una referencia ordinaria como cualquier otro objeto) y, por lo tanto, puede instanciar la clase anidada por sí misma.
Echemos un vistazo en la fuente de la sabiduría para estas preguntas: La Java efectiva de Joshua Bloch :
Técnicamente, no existe tal cosa como una clase interna estática. Según Effective Java , la terminología correcta es una clase anidada estática . Una clase anidada no estática es de hecho una clase interna, junto con clases anónimas y clases locales.
Y ahora para citar:
Cada instancia de una clase no estática [anidada] está asociada implícitamente con una instancia adjunta de su clase contenedora ... Es posible invocar métodos en la instancia adjunta.
Una clase anidada estática no tiene acceso a la instancia adjunta. Utiliza menos espacio también.
Hay dos diferencias entre clases internas estáticas y no internas.
En el caso de declarar campos y métodos de miembros, la clase interna no estática no puede tener campos y métodos estáticos. Pero, en el caso de la clase interna estática, puede tener campos y métodos estáticos y no estáticos.
La instancia de la clase interna no estática se crea con la referencia del objeto de la clase externa, en la que ha definido, esto significa que tiene una instancia adjunta. Pero la instancia de la clase interna estática se crea sin la referencia de la clase externa, lo que significa que no tiene una instancia adjunta.
Ver este ejemplo
class A
{
class B
{
// static int x; not allowed here
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A a = new A();
// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();
// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}
Una clase anidada estática interactúa con los miembros de la 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.
Una clase interna no puede ser estática, por lo que voy a reformular su pregunta como "¿Cuál es la diferencia entre clases anidadas estáticas y no estáticas?".
Como dijiste aquí, la clase interna no puede ser estática ... Encontré el siguiente código al que se le está dando estática ... ¿por qué? o lo que es correcto ....
Sí, no hay nada en la semántica de un tipo anidado estático que le impida hacer eso. Este fragmento funciona bien.
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
Este es un código publicado en este sitio web ...
para la pregunta ---> ¿Se puede crear una instancia de una clase anidada estática varias veces?
la respuesta fue --->
Ahora, por supuesto, el tipo anidado puede hacer su propio control de instancia (por ejemplo, constructores privados, 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 enumeración estática, por supuesto, no se puede crear una instancia.
Pero en general, sí, un tipo anidado estático se puede instanciar varias veces.
Tenga en cuenta que, técnicamente, un tipo anidado estático no es un tipo "interno".
Una clase interna, por definición , no puede ser estática, por lo que voy a volver a redactar su pregunta como "¿Cuál es la diferencia entre clases anidadas estáticas y no estáticas?"
Una clase anidada no estática tiene acceso completo a los miembros de la clase dentro de la cual está anidada. Una clase anidada estática no tiene una referencia a una instancia anidada, por lo que una clase anidada estática no puede invocar métodos no estáticos o acceder a campos no estáticos de una instancia de la clase dentro de la cual está anidada.
clase interna estática: puede declarar miembros estáticos y no estáticos, pero solo puede acceder a miembros estáticos de su clase principal.
clase interna no estática: puede declarar solo miembros no estáticos, pero puede acceder a miembros estáticos y no estáticos de su clase principal.