Una clase anidada tiene acceso a todos los atributos y métodos de la clase contenedora. Una clase anidada puede ser declarada public, protected, private o package (por defecto). Por el contrario, la clase contenedora sólo puede ser declarada public o package (por defecto). También, a diferencia de las clases contenedoras, una clase anidada puede ser declarada estática (static).
Las clases anidadas pueden ser divididas en dos categorías:
Clases anidadas no estáticas ( clases internas) --> Las clases internas tienen acceso directo a los métodos y los campos de la clase exterior, así como a los métodos y los campos que hereda de su superclase. Pero, debido a que una clase interna se ha cargado sólo dentro del contexto de una instancia de su clase exterior, no podemos definir ningún miembro estático.
Tenemos dos tipos diferente de clases anidad no estáticas:
Clases internas locales: Una clase interna local (a veces llamada clase local), es una clase declarada dentro de un bloque de código en el cuerpo de un método. Una clase interna local sólo es visible dentro del bloque de código en el que se ha definido.
Clases internas anónimas → Las clases internas anónimas (también llamada clases anónimas), son muy similares a las clases internas locales, pero sin nombre. En las clases internas locales primero se define la clase y luego se crean uno o más objetos. En las clases anónimas se unen estos dos pasos. Como la clase anónima no tiene nombre, sólo se puede crear un único objeto, ya que las clases anónimas no pueden definir constructores. Se utilizan en clases con poco código.Siempre deben ser clases interna e implícitamente finales.La declaración y el uso de la clase son adyacentes.Nunca pueden ser abstractas Nunca pueden ser clases estáticas.Para instanciar una clase interna desde algún lugar que no sea la clase exterior, primero debemos instanciar la clase exterior, y a continuación, instanciar la clase interior.
Clases anidadas estáticas → Las clases anidadas estáticas sólo pueden ser creadas dentro de otra clase al máximo nivel, es decir, directamente en el bloque de definición de la clase contenedora y no en un bloque más interno. Este tipo de clases anidadas se definen utilizando la palabra static.Debido a su carácter "estático", estas clases no pueden acceder a los miembros de su clase contenedora directamente, sino a través de la instancia de un objeto.Puede acceder a una clase anidada estática utilizando una referencia que remite a la clase: Outer.StaticNested