También debemos mencionar que si una clase tiene por lo menos un método abstracto, esta clase debe declararse como abstracta sin importar si posee o no métodos ya definidos, así como variables y métodos de acceso a estas variables. A continuación se muestra un pequeño ejemplo de Polimorfismo, tomando como base las clases utilizadas en el ejemplo de Herencia:
Codigo de la SuperClase Equipo
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ejemploherencia;
/**
*
* @author Guillermo Antonio
* En este caso se hace referencia
* a la superclase Object aunque no es necesario hacerlo
*/
public class Equipo extends Object{
//definimos las variables y el tipo de variables que vamos a usar.
String nombre;
String marca;
String modelo;
String serie;
String color;
//creamos el constructor que recibe por parametro todos los datos
public Equipo(String nombre, String marca, String modelo, String serie, String color) {
this.nombre = nombre;
this.marca = marca;
this.modelo = modelo;
this.serie = serie;
this.color = color;
}
//creamos los metodos de acceso para cada una de las variables
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public String getSerie() {
return serie;
}
public void setSerie(String serie) {
this.serie = serie;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//creamos los metodos encender y apagar que son comunes para todos los equipos
public void encender(Boolean enc){
if (enc){
System.out.print("Encendiendo Aparato \n");
}
}
public void apagar(Boolean enc){
if(!enc){
System.out.print("Aparato Apagado \n");
}
}
}
codigo de la Subclase Audio: Esta clase se define como abstracta pues es la que contiene el metodo abstracto textoConsola, este metodo se diferenciara en cada una de las subclases que hereden de la superclase Audio.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ejemploherencia;
/**
*
* @author Guillermo Antonio
* heredamos de la clase equipo todos sus metodos
* y caracteristicas
*
*/
public abstract class Audio extends Equipo{
//creamos el constructor de la clase audio
//no es necesario definir las variables nombre,marca,modelo, etc
//porque estas ya estan definidas en la superclase equipo
//asi como tambien estan definidos sus metodos de acceso
//solo agregaremos los atributos que tiene en particular esta subclase de equipo
String formatoAudio;
public Audio(String nombre, String marca, String modelo, String serie, String color, String formatoAudio) {
super(nombre, marca, modelo, serie, color);
//ponemos el valor de la variable formatoAudio que es la unica variable que no esta en la superclase equipo
this.formatoAudio=formatoAudio;
}
//creamos los metodos de acceso para la variable que se creo en esta clase
public String getFormatoAudio() {
return formatoAudio;
}
public void setFormatoAudio(String formatoAudio) {
this.formatoAudio = formatoAudio;
}
//se agregan los metodos unicos para esta clase
public void reproducir(Boolean rpdr){
if(rpdr){
System.out.println("Reproduciendo");
}else{
System.out.println("Sin Reproducir");
}
}
//metodo abstracto que sera definido por las subclases que heredan de esta superClase
//estos metodos tienen que seguir el siguiente formato
//abstract tipo nombreMetodo
public abstract String textoConsola();
}
codigo de la clase AutoEstereo: esta clase implementa el metodo abstracto de la superclase Audio
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ejemploherencia;
/**
*
* @author Guillermo Antonio
* esta clase hereda de la superclase Audio, que
* a la vez ess una subclase que hereda de la superclase Equipo
* esta clase va a tener los atributos y metodos tanto de la clase Equipo
* asi como tambien de la clase audio
*
*/
public class AutoEstereo extends Audio{
//definimos los atributos que son unicos para esta clase y no comparte con las otras subclases
//de la clase audio
int potenciaSalida;
String receptorMultimedia;
//este constructor recibe todos los valores y se los pasa a la super clase
//por medio del metodo super.
public AutoEstereo(String nombre, String marca, String modelo, String serie, String color, String formatoAudio,Integer potenciaSalida, String receptorMultimedia) {
super(nombre, marca, modelo, serie, color, formatoAudio);
this.potenciaSalida=potenciaSalida;
this.receptorMultimedia=receptorMultimedia;
}
//creamos los metodos de acceso para los atributos definidos en esta clase
public int getPotenciaSalida() {
return potenciaSalida;
}
public void setPotenciaSalida(int potenciaSalida) {
this.potenciaSalida = potenciaSalida;
}
public String getReceptorMultimedia() {
return receptorMultimedia;
}
public void setReceptorMultimedia(String receptorMultimedia) {
this.receptorMultimedia = receptorMultimedia;
}
//metodo que devuelve un String con todos los datos del autoEstereo
public String mostrarDatos(){
return "Datos: \n Nombre:"+this.nombre+"\n Modelo: "+this.modelo+" \n Marca: "+this.marca+"\n Serie: \t"+this.serie;
}
//este es el metodo que se declaro como abstracto pero que en las sub clases
//se tiene que definir como va a funcionar y cual es el codigo que va a ejecutar
@Override
public String textoConsola() {
return "El formato de texto es el siguiente: \n"
+ "# pista, nombre, artista, duracion";
}
}
codigo de la Clase que contiene el metodo main:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ejemploherencia;
import javax.swing.JOptionPane;
/**
*
* @author Guillermo Antonio
*/
public class EjemploHerencia {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//en esta clase vamos a crear una instancia de la clase AutoEstereo
//aunque la clase Auto Estereo no tenga el codigo para poner nombre, marca, etc
//se tiene acceso a estos atributos y metodos a traves de la instancia de AutoEstereo
//porque esta hereda de las clases Equipo y Audio
AutoEstereo estereo=new AutoEstereo("Reproductor MP3", "Sony", "RXY76Y", "XZ345T", "negro", "MP3", 55, "4 canales");
//a continuacion mostramos los datos en un mensaje
JOptionPane.showMessageDialog(null, estereo.mostrarDatos());
//despues de mostrar los datos del reproductor.. llamamos el metodo encender
estereo.encender(true);
//despues de encenderlo lo apagamos
estereo.apagar(false);
//imprimimos en consola el resultado del metodo implementado en la clase autoestereo
System.out.println(estereo.textoConsola());
}
}
Nota: Después de ver este ejemplo descargar el código fuente, e intenta crear mas métodos abstractos e implementarlos en diferentes subclases.
