son - variable de clase java




Java: Clase interna vs estática (6)

  1. 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.

  2. 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.

  3. 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".

  4. 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.

  5. 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.

  6. 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í:

¿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.


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

  1. 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.

  2. 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, 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.





inner-classes