Ir al contenido principal

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

Comentarios

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

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

    ResponderBorrar

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.

Entradas más populares de este blog

3 sencillos pasos para tramitar la ayuda por desempleo de la AFORE

¿Tienes dinero ahorrado en tu AFORE y en este momento no estás trabajando o estás trabajando pero no tienes seguro social? Si respondiste sí a la pregunta anterior entonces hay una buena noticia para ti: puedes retirar una parte del dinero que tienes ahorrado. Y lo mejor, es muy sencillo. En este artículo te diré paso a paso qué hacer para obtener ese dinero, sin tecnicismos legales ni nada por el estilo, simple y sencillamente lo que necesitas saber. Paso Número 1: Obtener los últimos 2 estados de cuenta de tu Afore Esto en la mayoría de los casos es sumamente sencillo ya que dichos estados de cuenta llegan directamente al domicilio del ahorrador, si este es tu caso puedes saltar lo restante en este punto y continuar con el paso número 2, en caso contrario sigue leyendo… Si no tienes tus estados de cuenta debes ponerte en contacto con la empresa encargada de administrar tu ahorro para que te los proporcione, normalmente te van a pedir una identificación oficial, comprobante de

Conectar una base de datos en MySQL con NetBeans

NetBeans es una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans. Si eres un programador y desarrollas tus aplicaciones en Java seguramente necesitarás conectar una base de datos tipo MySQL a este entorno algún día, bueno, si lo necesitas ahora, he aquí una explicación paso a paso de cómo conectar ambas herramientas.

4 extraordinarias aplicaciones espía para Android

Le andas haciendo al James Bond y necesitas grabar video, voz o tomar fotos desde tu dispositivo Android sin ser notado? Aquí 4 excelentes aplicaciones que facilitarán tus hazañas de 007 en menos de lo que canta un gallo.

c606 c6nf5g4r6 e3 tec3ad6 [Como configurar el teclado]

¿Problemas al escribir con el teclado? ¿Tratas de escribir la letra ‘o’ y sale el número ‘6’ o algo por el estilo? La solución puede ser más simple de lo que parece. La solución a tu problema tras el salto...

Conexión, consulta y ejecución de sentencias en MySQL con Java

Anteriormente escribí este mismo artículo pero para bases de datos en Oracle . En este artículo prácticamente me copio y pego para explicar paso a paso cómo realizar la conexión a MySQL en Java, así como la forma de realizar consultas a los registros existentes y ejecutar sentencias de inserción, borrado y actualización de datos. Al final del artículo tendremos una clase que encapsulará todos los procedimientos necesarios para trabajar con la base de datos.