Las clases
internas o inner class, como su
nombre indica, una clase interna es una clase dentro de otra.
public
class Clase1 {
class Clase2 {
código
Clase2
}
código
Clase1
}
La clase interna sería la Clase2.
¿Por qué son necesarias?
·
Para acceder a los campos privados de una clase desde otra clase.
·
Para ocultar una clase de otras pertenecientes al mismo paquete.
·
Para crear clases internas “anónimas”, muy útiles para gestionar eventos y
retrollamadas.
·
Cuando solo una clase debe acceder a los campos de ejemplar de otra clase.
Para ver todo esto vamos a utilizar el
ejemplo del apartado anterior PruebaTemporizador.java, dentro del método actionPerformed vamos a crear una
instrucción que lo ve va a hacer es además de mostrarnos la hora cada x tiempo
suene el típico “clic” de Windows. Para ello vamos a utilizar la clase
abstracta Toolkit, esta clase es
como un puente entre los recursos de nuestro sistema operativo y nuestros
programas Java, con esta clase podemos acceder a la resolución de nuestra
pantalla, a los sonidos del sistema, etc. Si escribimos esto:
public void
actionPerformed(ActionEvent e) {
Date
ahora = new Date();
System.out.println("La hora
cada 5 segundos: "+ahora);
Toolkit.getDefaultToolkit().beep();
}
Como ya se ha comentado, además de imprimir por
pantalla la hora cada 5 segundos va a sonar un clic, un sonido predeterminado
que viene con el sistema operativo. Si ejecutamos la aplicación veremos como se
muestra la hora y suena el clic.
Vamos a crear otro ejemplo va a consistir en lo mismo,
crear un temporizador, pero esta vez vamos a utilizar una clase interna. Nos
creamos una clase PruebaTemporizador2.java
e importamos los siguientes paquetes:
package poo;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
import java.awt.Toolkit;
public class
PruebaTemporizador2 {
public static void main(String[] args) {
}
}
A continuación nos creamos una clase a la que vamos a
llamar Reloj con su constructor que
le vamos a pasar como parámetros el intervalo de tiempo que queremos que se
ejecute el programa y el sonido que va a hacer cada vez que muestre la hora,
posteriormente las inicializamos y declaramos:
class Reloj {
public Reloj(int intervalo, boolean sonido) {
this.intervalo = intervalo;
this.sonido = sonido;
}
private int intervalo;
private boolean sonido;
}
Luego creamos un método para poner en marcha el
programa, después del constructor creamos el método:
public void enMarcha() {
ActionListener
oyente = new DameLaHora2();
Timer
mitemporizador = new Timer(intervalo, oyente);
mitemporizador.start();
}
Nos da error DameLahora2
que esa va a ser la clase interna que vamos a crear, después, utilizamos la
clase Timer, instanciamos y lo
ponemos en marcha.
Dentro del método main
instanciamos la clase Reloj:
public static void main(String[] args) {
Reloj
mireloj = new Reloj(3000, true);
mireloj.enMarcha();
JOptionPane.showMessageDialog(null, "Pulse
Aceptar para terminar");
System.exit(0);
}
Llamamos al método enMarcha, mediante una ventana JOptionPane
nos indica que la aplicación se ha iniciado, al pulsar el botón Aceptar
finalizará por la instrucción que le indicamos System.exit(0).
Después de la declaración de las variables nos creamos
la clase interna que va a tener el modificador de acceso private, solo las clases internas pueden llevar este modificador,
no pueden llevar otro, vamos a implementar la interfaz ActionListener, dentro del método actionPerformed vamos a indicar que nos muestre la hora mediante la
función Date, mediante un condicional le vamos a indicar
que suene el sonido cada vez que muestre la hora:
private class DameLaHora2 implements ActionListener
{
@Override
public void
actionPerformed(ActionEvent e) {
Date
ahora = new Date();
System.out.println("Te
muestro la hora cada 3 sg "+ahora);
if(sonido) {
Toolkit.getDefaultToolkit().beep();
}
}
Con esto nuestra aplicación estaría terminada.
3.2 INSTANCE OF << >> 3.4 CLASES INTERNAS LOCALES
No hay comentarios:
Publicar un comentario