Clases internas en Java(Inner/nested classes) 2

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 externa

Una 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 final

Deducimos 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í...

2 comentarios:

  1. Rafa dijo...:

    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.

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

  1. Anónimo dijo...:

    se puede declarar una clase anonima que implemente una interfaz y al mismo tiempo extienda una o mas clases??
    cual seria la firma?

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes