Programación Java: Hilos, Polimorfismo, Clases Random y Herencia con Ejemplos Prácticos

Informática7,36 KB

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);
    }
}

Descargar

PDF Word HTML