Programación Java: Hilos, Polimorfismo, Clases Random y Herencia con Ejemplos Prácticos
Programación en Java: Hilos, Polimorfismo, Números Aleatorios y Herencia
1. Hilos (Threads) en Java
En Java, un hilo es una unidad de ejecución independiente dentro de un programa. A continuación se presentan dos formas de crear hilos: heredando de la clase Thread y implementando la interfaz Runnable.
1.1. Creación de un hilo heredando de Thread
La clase MiHilo extiende Thread y sobrescribe el método run():
package mihilo;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MiHilo extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
try {
sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(MiHilo.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
1.2. Creación de un hilo implementando Runnable
La clase MiHilo2 implementa la interfaz Runnable, lo que resulta más flexible al permitir que la clase extienda otra superclase:
import static java.lang.Thread.sleep;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MiHilo2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(MiHilo2.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
1.3. Ejecución de los hilos
package mihilo;
/**
* @author Veronica
*/
public class Hilos {
public static void main(String[] args) {
MiHilo nombre = new MiHilo();
nombre.setName("Veronica");
MiHilo2 miHilo = new MiHilo2();
Thread nombre2 = new Thread(miHilo);
nombre2.setName("Irais");
nombre.start();
nombre2.start();
}
}
2. Generación de números aleatorios
2.1. Uso de la clase Random
Ejemplo de uso de la clase Random – aprenderaprogramar.com
import java.util.Random;
public class Programa {
public static void main(String arg[]) {
Random rnd = new Random();
System.out.println("Primera secuencia." + "\n");
System.out.println(rnd.nextDouble());
System.out.println(rnd.nextDouble());
System.out.println("Segunda secuencia." + "\n");
System.out.println(+rnd.nextDouble());
System.out.println(rnd.nextDouble());
}
}
2.2. Números enteros con Math.random()
Para obtener un número entero entre 1 y un límite N, hay que multiplicar el número aleatorio obtenido por N, sumarle 1 y convertirlo a entero:
(int)(Math.random() * N + 1);
Por ejemplo, para obtener 5 números aleatorios enteros entre 1 y 6:
for (int i = 1; i <= 5; i++)
System.out.println((int)(Math.random() * 6 + 1));
Para obtener un número entero entre dos valores DESDE y HASTA, ambos incluidos, se utiliza la fórmula:
(int)(Math.random() * (HASTA - DESDE + 1) + DESDE);
Por ejemplo, para generar 5 números enteros al azar entre 8 y 15:
for (int i = 1; i <= 5; i++)
System.out.println((int)(Math.random() * (15 - 8 + 1) + 8));
3. Polimorfismo con clases abstractas e interfaces
3.1. Clase abstracta Animal
public abstract class Animal {
public abstract void habla();
}
class Perro extends Animal {
public void habla() {
System.out.println("¡Guau!");
}
}
class Gato extends Animal {
public void habla() {
System.out.println("¡Miau!");
}
}
public class PoliApp {
public static void main(String[] args) {
Gato gato = new Gato();
hazleHablar(gato);
}
static void hazleHablar(Animal sujeto) {
sujeto.habla();
}
}
3.2. Interfaz Parlanchin
Se define una interfaz común que pueden implementar clases de distintas jerarquías:
public interface Parlanchin {
public abstract void habla();
}
public abstract class Animal implements Parlanchin {
public abstract void habla();
}
class Perro extends Animal {
public void habla() {
System.out.println("¡Guau!");
}
}
class Gato extends Animal {
public void habla() {
System.out.println("¡Miau!");
}
}
public abstract class Reloj {
}
class Cucu extends Reloj implements Parlanchin {
public void habla() {
System.out.println("¡Cucu, cucu, ..!");
}
}
public class PoliApp {
public static void main(String[] args) {
Gato gato = new Gato();
hazleHablar(gato);
Cucu cucu = new Cucu();
hazleHablar(cucu);
}
static void hazleHablar(Parlanchin sujeto) {
sujeto.habla();
}
}
4. Entrada de datos con Scanner
El siguiente fragmento solicita la edad al usuario por teclado:
int edad;
Scanner teclado = new Scanner(System.in);
System.out.println("¿Qué edad tienes?");
edad = teclado.nextInt();
5. Herencia en Java
5.1. Clase base Persona
package qualityinfosolutions;
public class Persona {
String nombre;
String rut;
int edad;
// Constructor de la clase base
public Persona(String nombre, String rut, int edad) {
this.nombre = nombre;
this.rut = rut;
this.edad = edad;
}
// Método para mostrar los datos (solo para uso de este ejemplo)
public void mostrarDatos() {
System.out.println("Nombre: " + this.nombre);
System.out.println("Rut: " + this.rut);
System.out.println("Edad: " + this.edad);
}
}
5.2. Clase derivada Alumno
package qualityinfosolutions;
public class Alumno extends Persona {
String colegio;
int numero_matricula;
public Alumno(String colegio, int numero_matricula, String nombre, String rut, int edad) {
super(nombre, rut, edad); // Utilizamos el constructor de la clase base
this.colegio = colegio;
this.numero_matricula = numero_matricula;
}
@Override // Reemplaza el método con el mismo nombre de la clase base
public void mostrarDatos() {
super.mostrarDatos(); // Llamamos al método mostrarDatos de la clase base
System.out.println("Colegio: " + this.colegio);
System.out.println("Número de Matrícula: " + this.numero_matricula);
}
}
5.3. Clase derivada Profesor
package qualityinfosolutions;
public class Profesor extends Persona {
String asignatura;
public Profesor(String asignatura_profesor, String nombre, String rut, int edad) {
super(nombre, rut, edad); // Utilizamos el constructor de la clase base
this.asignatura = asignatura_profesor;
}
@Override // Reemplaza el método con el mismo nombre de la clase base
public void mostrarDatos() {
super.mostrarDatos();
System.out.println("Asignatura: " + this.asignatura);
}
}