Java: clase estática vs interna [duplicado]

Resuelto Abhishek Sanghvi asked hace 15 años • 8 respuestas

¿Cuál es la diferencia entre clases anidadas estáticas y no estáticas?

Abhishek Sanghvi avatar Aug 30 '09 14:08 Abhishek Sanghvi
Aceptado

Una clase interna, por definición , 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?"

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 ni acceder a campos no estáticos de una instancia de la clase dentro de la cual está anidada.

Brandon E Taylor avatar Aug 30 '2009 07:08 Brandon E Taylor

Busquemos en la fuente de sabiduría para este tipo de preguntas: Java efectivo de Joshua Bloch :

Técnicamente, no existe una clase interna estática. Según Effective Java , la terminología correcta es clase anidada estática . Una clase anidada no estática es de hecho una clase interna, junto con las clases anónimas y las clases locales.

Y ahora para citar:

Cada instancia de una clase anidada no estática está implícitamente asociada 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. También utiliza menos espacio.

Steve McLeod avatar Aug 30 '2009 07:08 Steve McLeod

Hay dos diferencias entre clases internas estáticas y no estáticas.

  1. En caso de declarar campos y métodos miembro, la clase interna no estática no puede tener campos y métodos estáticos. Pero, en el caso de una clase interna estática, puede tener campos y métodos estáticos y no estáticos.

  2. La instancia de la clase interna no estática se crea con la referencia del objeto de la clase externa, en la que se 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(); 
    }
}
 avatar Dec 07 '2012 18:12