Programación Orientada a Objetos: Ejemplo de Aves
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 7,94 KB
Ejemplo de Herencia y Polimorfismo en Java: Clasificación de Aves
1. Introducción
Este código Java ilustra los principios de la Programación Orientada a Objetos (POO) utilizando el ejemplo de la clasificación de aves. Se definen clases para diferentes tipos de aves, cada una con sus propios comportamientos, demostrando conceptos como herencia, interfaces y polimorfismo.
2. Estructura del Código
2.1. Clase Ave
La clase Ave
es la clase base que define las características comunes a todas las aves:
- Atributos:
especie
(protegido),pais
(protegido),tienePlumas
(final booleano),poneHuevos
(final booleano). - Constructor: Inicializa la especie y el país del ave.
- Métodos:
toString()
(sobreescrito),getEspecie()
,setEspecie()
.
package aves;
public class Ave {
protected String especie;
protected String pais;
final boolean tienePlumas = true;
final boolean poneHuevos = true;
public Ave(String especie, String pais) {
this.especie = especie;
this.pais = pais;
}
@Override
public String toString() {
return "Tipo de ave: " + especie + " Pais de origen: " + pais + " Tiene plumas: " + tienePlumas + " Pone huevos: " + poneHuevos;
}
public String getEspecie() {
return especie;
}
public void setEspecie(String especie) {
this.especie = especie;
}
}
2.2. Interfaces
Se definen tres interfaces para representar diferentes comportamientos de las aves:
Nadador
: Con el métodonadar()
.Volador
: Con el métodovolar()
.Corredor
: Con el métodocorrer()
.
public interface Nadador {
public void nadar();
}
public interface Volador {
public void volar();
}
public interface Corredor {
public void correr();
}
2.3. Clases Derivadas
Se crean clases específicas para cada tipo de ave, heredando de la clase Ave
e implementando las interfaces correspondientes:
Aguila
: ImplementaVolador
.Avestruz
: ImplementaCorredor
.Cormoran
: ImplementaNadador
yVolador
.Kiwi
: ImplementaCorredor
.Pinguino
: ImplementaNadador
.
public class Aguila extends Ave implements Volador {
public Aguila(String pais) {
super("Aguila", pais);
}
@Override
public void volar() {
System.out.println("Soy un " + especie + " y estoy volando. ");
}
}
public class Avestruz extends Ave implements Corredor {
public Avestruz(String pais) {
super("Avestruz", pais);
}
@Override
public void correr() {
System.out.println("Soy un " + especie + " y estoy corriendo. ");
}
}
public class Cormoran extends Ave implements Nadador, Volador {
public Cormoran(String pais) {
super("Cormoran", pais);
}
@Override
public void nadar() {
System.out.println("Soy un " + especie + " y estoy nadando ");
}
@Override
public void volar() {
System.out.println("Soy un " + especie + " y estoy volando ");
}
}
public class Kiwi extends Ave implements Corredor {
public Kiwi(String pais) {
super("Kiwi", pais);
}
@Override
public void correr() {
System.out.println("Soy un " + especie + " y estoy corriendo. ");
}
}
public class Pinguino extends Ave implements Nadador {
public Pinguino(String pais) {
super("Pingüino", pais);
}
@Override
public void nadar() {
System.out.println("Soy un " + especie + " y estoy nadando ");
}
}
2.4. Clases de Entrada y Salida
La clase EntradaSalida
maneja la interacción con el usuario, mientras que la clase Principal
contiene el método main
que inicia la ejecución del programa.
import java.util.Scanner;
public class EntradaSalida {
public static Scanner teclado = new Scanner(System.in);
public static String leeString(String mensaje) {
System.out.println(mensaje);
return teclado.nextLine();
}
public static int leeInt(String mensaje, int min, int max) {
System.out.println(mensaje);
int numero = 0;
boolean error;
do {
try {
numero = teclado.nextInt();
if (numero < min || numero > max) {
error = true;
System.out.println("Error: introduce un entero entre " + min + " y " + max);
} else {
error = false;
}
} catch (Exception e) {
System.out.println("Error: introduce un entero entre " + min + " y " + max);
error = true;
}
teclado.nextLine();
} while (error == true);
return numero;
}
public static Ave leeAve() {
Ave ave = null;
System.out.println("Introduzca el tipo de ave que quiera crear: ");
int tipo = EntradaSalida.leeInt("0) Avestruz\n1) Cormoran\n2) Kiwi\n3) Pingüino\n4) Aguila", 0, 4);
String pais = EntradaSalida.leeString("Introduce el país del ave: ");
switch (tipo) {
case 0:
ave = new Avestruz(pais);
break;
case 1:
ave = new Cormoran(pais);
break;
case 2:
ave = new Kiwi(pais);
break;
case 3:
ave = new Pinguino(pais);
break;
case 4:
ave = new Aguila(pais);
break;
}
return ave;
}
}
public class Principal {
public static void main(String[] args) {
boolean repite = true;
final int N = 100;
Volador[] voladoras = new Volador[N];
Corredor[] corredoras = new Corredor[N];
Nadador[] nadadoras = new Nadador[N];
int cuentaCorr = 0;
int cuentaNada = 0;
int cuentaVola = 0;
do {
Ave ave = EntradaSalida.leeAve();
if (ave instanceof Corredor) {
corredoras[cuentaCorr] = (Corredor) ave;
cuentaCorr++;
}
if (ave instanceof Nadador) {
nadadoras[cuentaNada] = (Nadador) ave;
cuentaNada++;
}
if (ave instanceof Volador) {
voladoras[cuentaVola] = (Volador) ave;
cuentaVola++;
}
switch (EntradaSalida.leeInt("1) Añadir nueva ave\n2) Mostrar resultado", 1, 2)) {
case 1:
repite = true;
break;
case 2:
repite = false;
break;
}
} while (repite == true);
System.out.println("AVES CORREDORAS: ");
for (int i = 0; i < cuentaCorr; i++) {
corredoras[i].correr();
System.out.println(corredoras[i]);
}
System.out.println("AVES NADADORAS: ");
for (int i = 0; i < cuentaNada; i++) {
nadadoras[i].nadar();
System.out.println(nadadoras[i]);
}
System.out.println("AVES VOLADORAS: ");
for (int i = 0; i < cuentaVola; i++) {
voladoras[i].volar();
System.out.println(voladoras[i]);
}
}
}
3. Conclusión
Este ejemplo demuestra cómo la POO permite modelar entidades del mundo real en un programa. La herencia permite la reutilización de código y la creación de jerarquías de clases, mientras que las interfaces y el polimorfismo proporcionan flexibilidad y extensibilidad al código.