Clases internas de métodos locales::Una clase interna regular se encuentra dentro de la clase pero afuera de cualquier método de dicha clase. En Java existe lo que llamamos clases internas de métodos locales, las cuales pueden ser definidas dentro de los métodos como se muestra en el siguiente ejemplo:
public class Externa2 { private String x = "Externa2"; void hacerAlgo(){ class Interna{ public void verExterna(){ System.out.println("La variable x es: " + x); }//cerramos el método de la clase interna }//cerramos la clase interna }//cerramos el método local de la clase externa }//cerramos la clase externa El código anterior declara una clase Externa2, con una variable privada de tipo cadena que contiene la palabra "Externa2" y un método llamado hacerAlgo(), dentro de dicho método se define una clase interna de método local de nombre Interna que a su vez tiene un método llamado verExterna() que nos permite ver el contenido de la variable x imprimiéndolo en pantalla.
De cualquier manera el código anterior es legal pero inútil ya que nunca instanciamos la clase Interna y por lo tanto no podemos acceder su método definido. Si queremos utilizar la clase Interna definida anteriormente debemos de crear una instancia de dicha clase dentro del método pero debajo de la definición de la clase como se muestra en el siguiente código:
public class Externa2 { private String x = "Externa2"; void hacerAlgo(){ class Interna{ public void verExterna(){ System.out.println("La variable x es: " + x); }//cerramos el método de la clase interna }//cerramos la clase interna Interna i = new Interna(); i.verExterna(); }//cerramos el método local de la clase externa }//cerramos la clase externaUna clase interna de un método local puede ser instanciada solo dentro del método donde la clase interna fue definida. Una clase interna no puede utilizar las variables locales del método en el cual está definida, si se trata de utilizar alguna se obtendrá un error al compilar más o menos así:
local variable z is accessed from within inner class;needs to be declared finalDeducimos entonces que sí es posible utilizar una variable local dentro de una clase interna de método local, pero solamente si dicha variable está marcada como final, por lo tanto, no podremos cambiar su contenido sino solamente utilizarlo o imprimirlo. Una clase interna de método local no puede ser marcada con public, protected, private, static, transient o algo por el estilo, solamente puede ser final o abstracta pero no ambas al mismo tiempo.
Clases internas anónimas::Existen algunas clases internas en Java a las cuales no es necesario nombrar, pueden ser declaradas no solo dentro de un método sino dentro de un argumento para un método. Veamos el código:
public class ClaseAnonima { Comida c = new Comida(){ public void comer(){ System.out.println("Clase comida anónima"); } };}class Comida{ public void comer(){ System.out.println("Comiendo"); }}¿Qué fue lo que hicimos aquí?:
+ Definimos 2 clases, ClaseAnonima y Comida.
+ La clase comida tiene el método comer().
+ ClaseAnonima tiene una variable de instancia de Comida.
+ La ClaseAnonima no tiene métodos.
La variable de instancia de Comida no hace referencia a una instancia de Comida sino a una clase anónima que es una subclase de Comida. Veamos el código de la clase anónima solamente:
Comida c = new Comida(){ public void comer(){ System.out.println("Clase comida anónima"); }};La declaración de la variable de instancia c no termina con un punto y coma(;) sino con una llave abierta({), al final se cierra la declaración de la clase anónima con una llave cerrada(}) seguida de un punto y coma(;).
Se puede utilizar lo mismo con interfaces, solo que al utilizarlo con una interface anónima no se extiende la interface de la cual se está creando sino que se implementa. P. ej.:
interface Cocinable{ public void cocinar();}class Comida{ Cocinable co = new Cocinable(){ public void cocinar(){ System.out.printl("Implementación anónima de la interfaz Cocinable"); } };}Aunque parece que la interface está siendo instanciada, no es así. Todas las interfaces son abstractas, por lo tanto, no se pueden instanciar, aunque en el código anterior lo parezca.
Hasta aquí llegamos con clases internas en Java. ¿Alguna duda? deja tu comentario.
Más explicaciones de Java aquí...
Mmmmm Valla que buena informacion, no es muy complicado pero es el primer sitio en el que entre y me ha convencido tu forma en que lo has explicado.
ResponderBorrarApenas me adentro a las interfaces graficas y este tipo de cosas aparecen a cada rato, con esta informacion se me aclaran muchas cosas.
Bueno, gracias y sigue publicando.
se puede declarar una clase anonima que implemente una interfaz y al mismo tiempo extienda una o mas clases??
ResponderBorrarcual seria la firma?