You are on page 1of 88

Programacin en Java para Ingenieros

CAPTULO 5
HERENCIA Y
POLIMORFISMO
Autor: Ing. Csar Villacs Silva

Programacin en Java para Ingenieros


5.1.

Introduccin

Los lenguajes de programacin orientados a objetos como el Java proporcionan


mecanismos para reutilizar cdigo. Los principales beneficios de la reutilizacin del
cdigo son el incremento de la productividad y la facilidad del mantenimiento del
cdigo. Las funciones, las clases y todos los mecanismos de abstraccin que tienen
estos lenguajes permiten que el cdigo sea reutilizable; mientras que el uso de
comentarios en cada funcin y en cada algoritmo de un programa ayuda al
mantenimiento del cdigo.
En la programacin se generalizan las cosas tal como sucede tambin en las
matemticas. Los matemticos generalizan entes abstractos que resuelven un
problema siempre de la misma manera. Al resolver un problema con la forma ms
general, la solucin se aplica a todos las formas especficas con similares
caractersticas. De manera similar, en los lenguajes de programacin orientados a
objetos, el mecanismo de abstraccin de la herencia, permite definir una clase
genrica y compartir todos sus atributos y mtodos con otras clases especficas. Esta
es la manera en la que se puede escribir una sola vez un cdigo general compartido, y
luego se lo puede reutilizar en varias clases especficas. El concepto de reutilizar el
cdigo a travs de la herencia es el primer tema de este captulo.
Adicionalmente a la generalizacin, se puede tambin trabajar con un conjunto de
objetos de clases especficas a un nivel general. Por ejemplo: si se plantea escribir un
programa para dibujar y pintar, tipo Paint, se necesitan varias clases especficas de
figuras geomtricas tales como Linea, Rectangulo, Triangulo, Circulo, Ovalo, Curva,
etc. Luego a partir de todas estas figuras, se podra utilizar la herencia y crear
atributos y mtodos desde una clase general llamada Figura. Al combinar los objetos
de tipo Linea, con los objetos de tipo Rectangulo, con los objetos de tipo Triangulo,
con los objetos de tipo Circulo, con los objetos de tipo Ovalo, con los objetos de tipo
Curva, etc., dentro de una lista de tipo Figura o en un arreglo de objetos, se habilita en
s mismo la funcionalidad de trabajar en un nivel superior con todas estas figuras. Por
lo tanto, se puede controlar con una iteracin sobre todas las figuras la capacidad de
dibujarse a s mismas, sin necesidad de considerar a una figura en especial. Por otra
parte, es posible generalizar los objetos especficos de tipo Figura con la clase Figura,
y a partir de ellos saber cmo se dibujaran por s mismos, en adicin a la forma
general, con el uso del polimorfismo.

5.2. Objetivos del Captulo

Revisar los principales conceptos en torno a la herencia y al polimorfismo.


Entender como la herencia se aplica en Java en la construccin de programas,
con cdigo eficiente.
Entender cmo trabaja el polimorfismo y cmo se lo aplica en Java, en la
construccin de programas con cdigo eficiente.
Aprender cmo crear tipos de datos abstractos e intrefaces en Java.
Disear y crear programas en Java utilizando herencia y polimorfismo.

Programacin en Java para Ingenieros


5.3. Conceptos Bsicos de Herencia
La herencia permite a una clase derivada, tambin conocida como clase hija o
subclase, heredar los datos miembro (atributos) y las funciones miembro (mtodos)
de una clase base, tambin conocida como clase padre o madre o superclase.
Los miembros pblicos (public members) de una superclase son accesibles por todos
los mtodos de las clases derivadas en el programa. Los miembros privados (private
members) de una superclase solamente son accesibles por los mtodos de la
superclase. El especificador de acceso protegido (protected) sirve como un nivel
intermedio de proteccin entre el especificador de acceso pblico (public) y el
privado (private). Los miembros protegidos de una superclase pueden ser
accedidos solamente por mtodos de la superclase y por mtodos de la subclase
y por mtodos de otras clases en el mismo paquete (package). Cuando un mtodo de
la subclase sobrecarga a un mtodo de la superclase, el mtodo de la superclase
puede ser accedido desde la subclase precediendo al nombre del mtodo de la
superclase con la palabra clave super seguido por el operador punto (.). Lo
interesante en este punto es que si se llama al constructor padre dentro del
constructor de la clase derivada, el cual tiene una serie de parmetros, donde algunos
de ellos corresponden a los datos miembros de la clase base, se utiliza la palabra clave
super, seguida por una lista de parmetros conocida como la lista de inicializacin
de datos miembros. En el Ejercicio 5.1 se va a mostrar el uso de clases derivadas, de
acuerdo a lo que se plantea en ese ejercicio.
Ejercicio 5.1: Escribir un programa que permita representar las siguientes figuras
geomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando herencia.
Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular el
permetro y el rea de esas figuras, de acuerdo a las siguientes frmulas matemticas:
Figura

Nombre
Crculo

Datos
r = radio

Rectngulo

a = ancho
b = largo

Tringulo

a, b, c = lados
s = semipermetro

Permetro

rea

b
a

)(

)(

La implementacin de todo este programa se lo realizar en un archivo de proyecto de


tipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_1, que
contiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene cinco
clases las mismas que son: Punto2D, Circulo, Rectangulo, Triangulo y Programa, que
son las clases con las cuales se resolvern el presente ejercicio, tal y como lo muestra
la Figura 5.1.

Programacin en Java para Ingenieros

Figura 5.1. Proyecto JavaConsolaPrograma_5_1.


Para resolver este ejercicio, primeramente se va crear una clase lo ms general
posible, con la posibilidad de reutilizar sus atributos, propiedades y mtodos generales
en otras clases especficas, y con lo cual se evita la duplicacin de cdigo. Primero se
va a crear la clase Punto2D, la cual es una clase completamente general, y puede
contribuir en la generacin de diferentes figuras geomtricas como el crculo, el
rectngulo y el tringulo.
Por lo pronto, se puede decir que la clase Punto2D va a tener la posicin en
coordenadas cartesianas de cualquier figura geomtrica en el plano, para lo cual se va
a tener dos atributos: mX de tipo float, que representa a la coordenada x de un punto
en el plano y mY de tipo float que representa a la coordenada y de un punto en el
plano. Por cada atributo, se tienen dos propiedades que manejan los descriptores de
acceso set (colocar) y get (obtener), las cuales son:
a) Para el atributo mX se tienen las siguientes propiedades: getX y setX.
b) Para el atributo mY se tienen las siguientes propiedades: getY y setY.
Estos atributos se han definido utilizando el especificador de acceso protected, ya que
la clase Punto2D es la clase base de toda la aplicacin.
Se definirn algunos mtodos para la clase Punto2D de acuerdo a las acciones que
puede hacer y que bsicamente sern funciones para poder operar un punto en el
plano. La implementacin de esta clase general Punto2D, se presenta a continuacin en
la tabla 5.1.1, que es parte de la solucin del ejercicio 5.1.
Tabla 5.1.1: Cdigo de la clase Punto2D del programa.
/*
* Cdigo del archivo Punto2D.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

Programacin en Java para Ingenieros


public class Punto2D
{
// Atributos de la clase.
protected float mX;
protected float mY;
// Mtodos de la clase.
// Constructor sin argumentos.
public Punto2D()
{
setX(0); setY(0);
}
// Constructor con dos argumentos.
public Punto2D(float x, float y)
{
setX(x); setY(y);
}
// Funcin que obtiene la coordenada 'x' de un punto.
public float getX()
{
return mX;
}
// Funcin que inicializa la coordenada 'x' de un punto.
public void setX(float x)
{
this.mX = x;
}
// Funcin que obtiene la coordenada 'y' de un punto.
public float getY()
{
return mY;
}
// Funcin que inicializa la coordenada 'y' de un punto.
public void setY(float y)
{
this.mY = y;
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Punto\n");
}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.
public String getCoordenadas()
{
return("(" + getX() + ", " + getY() + ")");

Programacin en Java para Ingenieros


}
// Funcin que imprime los datos de un punto.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getCoordenadas());
}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.
public void LeerDatos()
{
String sData = "";
try
{
System.out.printf("Ingrese el valor de la coordenada x: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mX = Float.parseFloat (sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor de la coordenada y: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mY = Float.parseFloat (sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
Como se puede ver en el cdigo de la tabla 5.1.1, no se necesita incluir ningn atributo
adicional como el radio del crculo, la base y la altura del rectngulo, entre otros; ni
tampoco se necesita incluir mtodos para calcular el permetro y el rea de las figuras
mencionadas anteriormente. En esta seccin del programa solo se est creando la
clase general.
Observe que la palabra clave protected ha sido utilizada en lugar de la palabra clave
private. Esto permite que una clase derivada acceda a los datos miembros de la clase
base y adems indica que no hay ninguna restriccin con la clase que fue diseada
para el propsito de la herencia y la derivacin de las clases hijas.

Programacin en Java para Ingenieros


Una vez que se tiene la clase base, se pueden definir las clases derivadas las mismas
que son: a) clase Circulo; b) clase Rectangulo; c) clase Triangulo. Para crear la
jerarqua de clases en cdigo se escribe lo siguiente, donde el detalle de cada clase se
omite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public class Punto2D {}
public class Circulo extends Punto2D {}
public class Rectangulo extends Punto2D {}
public class Triangulo extends Punto2D {}
Como se puede ver en el cdigo anterior, se utiliza la palabra clave extends que indica
que tanto la clase Circulo, como la clase Rectangulo y la clase Triangulo son clases
derivadas (subclases o hijas) de la clase Punto2D (superclase o padre) o se dice
tambin que existe una herencia pblica desde la clase Punto2D, hacia sus clases hijas.
El atributo que se tiene en la clase Circulo es tan solo el radio representado por el
dato miembro mRadio que es de tipo float. Para este atributo, se tienen dos
propiedades que manejan los descriptores de acceso set (colocar) y get (obtener), las
cuales son: getRadio y setRadio.
Se definirn algunos mtodos para la clase Circulo de acuerdo a las acciones que
puede hacer y que bsicamente sern funciones para poder representar y operar un
crculo en el plano.
Como se discuti previamente en este captulo, se puede invocar a un mtodo de la
superclase desde la clase derivada utilizando la palabra reservada super seguida por el
nombre del mtodo que se quiere invocar; cuando no se invoca a ningn mtodo en
particular, automticamente se llama al constructor de la superclase, con una lista de
parmetros.
Una clase derivada est hecha por dos partes: la parte de la clase padre y la parte
especfica de la clase hija. Consecuentemente, se puede invocar al constructor de la
clase padre para construir la parte que le corresponde a esa clase, e incluso se puede
enviar una lista de parmetros para que los inicialice, lo cual se conoce como lista de
inicializacin de miembros.
Adicionalmente, cuando un objeto es inicializado, la memoria de sus miembros se
construye primero (o son inicializados) antes de que el cdigo del constructor de la
clase sea ejecutado. Se puede explcitamente especificar la manera en que un dato
miembro podra ser construido en la lista de inicializacin de miembros.
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla
5.1.2, que es parte de la solucin del ejercicio 5.1.
Tabla 5.1.2: Cdigo de la clase Crculo del programa.
/*
* Cdigo del archivo Circulo.java
*/
package PaqueteFigurasGeometricas;

Programacin en Java para Ingenieros


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Circulo extends Punto2D
{
// Atributos de la clase.
private float mRadio;
// Mtodos de la clase.
// Constructor sin argumentos.
public Circulo()
{
// Llamada al constructor con dos parmetros de la clase padre.
super(0.0f, 0.0f);
setRadio(0.0f);
}
// Constructor con tres argumentos.
public Circulo(float x, float y, float r)
{
// Llamada al constructor con dos parmetros de la clase padre.
super(x, y);
setRadio(r);
}
// Funcin que obtiene el radio de un crculo.
public float getRadio()
{
return mRadio;
}
// Funcin que inicializa el radio de un crculo.
public void setRadio(float radio)
{
// Se verifica que el radio del crculo no sea negativo.
if(radio >= 0)
{
this.mRadio = radio;
}
else
{
this.mRadio = 0.0f;
}
}
// Funcin que calcula el rea de un crculo.
public float Area()
{
return((float)Math.PI * mRadio * mRadio);
}
// Funcin que calcula el permetro de un crculo.
public float Perimetro()

Programacin en Java para Ingenieros


{
return(2 * (float)Math.PI * mRadio);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un crculo e imprime esos resultados.
public void Calcular()
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Crculo\n");
}
// Funcin que obtiene los datos de un crculo y los imprime por
// pantalla en forma de cadena.
public String getDatosCirculo()
{
return("Centro = " + super.getCoordenadas() +
"; Radio = " + getRadio());
}
// Funcin que imprime los datos de un crculo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosCirculo());
}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del radio: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mRadio = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en la
tabla 5.1.3, que es parte de la solucin del ejercicio 5.1.

Programacin en Java para Ingenieros


Los atributos que se tienen en la clase Rectangulo son el ancho y el largo
representados por los datos miembros mAncho y mLargo que son de tipo float. Por cada
atributo, se tiene dos propiedades que manejan los descriptores de acceso set
(colocar) y get (obtener), las cuales son:
a) Para el atributo mAncho se tienen las siguientes propiedades: getAncho y
setAncho.
b) Para el atributo mLargo se tienen las siguientes propiedades: getLargo y
setLargo.
Esta clase tambin posee un grupo de mtodos que de manera similar a la clase
Circulo, realizan diferentes operaciones y donde se necesite se puede invocar a las
funciones de la clase padre utilizando la palabra reservada super.
Se definirn algunos mtodos para la clase Rectangulo de acuerdo a las acciones que
puede hacer y que bsicamente sern funciones para poder representar y operar un
rectngulo en el plano.
Tabla 5.1.3: Cdigo de la clase Rectngulo del programa.
/*
* Cdigo del archivo Rectangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Rectangulo extends Punto2D
{
// Atributos de la clase.
private float mAncho;
private float mLargo;
// Mtodos de la clase.
// Constructor sin argumentos.
public Rectangulo()
{
super(0.0f, 0.0f);
setAncho(0.0f);
setLargo(0.0f);
}
// Constructor con dos argumentos.
public Rectangulo(float x, float y, float ancho, float largo)
{
super(x, y);
setAncho(ancho);
setLargo(largo);
}

10

Programacin en Java para Ingenieros


// Funcin que obtiene la base de un rectngulo.
public float getAncho()
{
return mAncho;
}
// Funcin que inicializa la base de un rectngulo.
public void setAncho(float ancho)
{
// Se verifica que el ancho del rectngulo no sea negativo.
if(ancho >= 0)
{
this.mAncho = ancho;
}
else
{
this.mAncho = 0.0f;
}
}
// Funcin que obtiene la altura de un rectngulo.
public float getLargo()
{
return mLargo;
}
// Funcin que inicializa la altura de un rectngulo.
public void setLargo(float largo)
{
// Se verifica que el largo del rectngulo no sea negativo.
if(largo >= 0)
{
this.mLargo = largo;
}
else
{
this.mLargo = 0.0f;
}
}
// Funcin que calcula el rea de un rectngulo.
public float Area()
{
return(mAncho * mLargo);
}
// Funcin que calcula el permetro de un rectngulo.
public float Perimetro()
{
return(2 * mAncho + 2 * mLargo);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un rectngulo e imprime esos resultados.
public void Calcular()

11

Programacin en Java para Ingenieros


{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Rectngulo\n");
}
// Funcin que obtiene los datos de un rectngulo y los imprime por
// pantalla en forma de cadena.
public String getDatosRectangulo()
{
return("Vrtice = " + super.getCoordenadas() +
"; Ancho = " + getAncho() +
"; Largo = " + getLargo());
}
// Funcin que imprime los datos de un rectngulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosRectangulo());
}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo
// de un rectngulo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del ancho: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mAncho = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del largo: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mLargo = Float.parseFloat(sData);
}

12

Programacin en Java para Ingenieros


catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en la
tabla 5.1.4, que es parte de la solucin del ejercicio 5.1.
Los atributos que se tienen en la clase Triangulo son los tres lados que tiene un
tringulo representados por los datos miembros mA, mB y mC que son de tipo float. Por
cada atributo, se tiene dos propiedades que manejan los descriptores de acceso set
(colocar) y get (obtener), las cuales son:
a) Para el atributo mA se tienen las siguientes propiedades: getA y setA.
b) Para el atributo mB se tienen las siguientes propiedades: getB y setB.
c) Para el atributo mC se tienen las siguientes propiedades: getC y setC.
Esta clase tambin posee un grupo de mtodos que de manera similar a la clase
Rectangulo, realizan diferentes operaciones y donde se necesite se puede invocar a las
funciones de la clase padre utilizando la palabra reservada super.
Se definirn algunos mtodos para la clase Triangulo de acuerdo a las acciones que
puede hacer y que bsicamente sern funciones para poder representar y operar un
tringulo en el plano.
Tabla 5.1.4: Cdigo de la clase Tringulo del programa.
/*
* Cdigo del archivo Triangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Triangulo extends Punto2D
{
// Atributos de la clase.
private float mA;
private float mB;
private float mC;
// Mtodos de la clase.
// Constructor sin argumentos.
public Triangulo()
{
super(0.0f, 0.0f);
setA(0.0f);
setB(0.0f);

13

Programacin en Java para Ingenieros


setC(0.0f);
}
// Constructor con cuatro argumentos.
public Triangulo(float x, float y, float a, float b, float c)
{
super(x, y);
setA(a);
setB(b);
setC(c);
}
// Funcin que obtiene el lado 'a' del tringulo.
public float getA()
{
return mA;
}
// Funcin que inicializa el lado 'a' del tringulo.
public void setA(float a)
{
// Se verifica que el lado 'a' del tringulo no sea negativo.
if(a >= 0)
{
this.mA = a;
}
else
{
this.mA = 0.0f;
}
}
// Funcin que obtiene el lado 'b' del tringulo.
public float getB()
{
return mB;
}
// Funcin que inicializa el lado 'b' del tringulo.
public void setB(float b)
{
// Se verifica que el lado 'b' del tringulo no sea negativo.
if(b >= 0)
{
this.mB = b;
}
else
{
this.mB = 0.0f;
}
}
// Funcin que obtiene el lado 'c' del tringulo.
public float getC()
{

14

Programacin en Java para Ingenieros


return mC;
}
// Funcin que inicializa el lado 'c' del tringulo.
public void setC(float c)
{
// Se verifica que el lado 'c' del tringulo no sea negativo.
if(c >= 0)
{
this.mC = c;
}
else
{
this.mC = 0.0f;
}
}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.
public float Area()
{
float s = Semiperimetro(mA, mB, mC);
return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.
private static float Semiperimetro(float a, float b, float c)
{
return((a + b + c) / 2);
}
// Funcin que calcula el permetro de un tringulo.
public float Perimetro()
{
return(2 * Semiperimetro(mA, mB, mC));
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un tringulo e imprime esos resultados.
public void Calcular()
{
// Se verifica la existencia de un tringulo, comprobando que la suma
// de cualquiera de los dos lados de un tringulo sea mayor que el
// tercer lado.
if((mA + mB > mC) && (mA + mC > mB) && (mB + mC > mA))
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
else
{
System.out.printf("El tringulo no existe...\n");
}
}
// Funcin que obtiene el tipo de figura geomtrica.

15

Programacin en Java para Ingenieros


public String getTipo()
{
return("Tringulo\n");
}
// Funcin que obtiene los datos de un tringulo y los imprime por
// pantalla en forma de cadena.
public String getDatosTriangulo()
{
return("Vrtice = " + super.getCoordenadas() +
"; Lado 'a' = " + getA() +
"; Lado 'b' = " + getB() +
"; Lado 'c' = " + getC());
}
// Funcin que imprime los datos de un tringulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosTriangulo());
}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del lado 'a': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mA = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del lado 'b': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mB = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}

16

Programacin en Java para Ingenieros


try
{
System.out.printf("Ingrese el valor del lado 'c': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mC = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
// Funcin con parmetros que inicializa las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera, utilizando
// los parmetros 'a', 'b' y 'c' que son asignados a los datos miembro
// de la clase.
public void setLadosTriangulo(float a, float b, float c)
{
mA = a; mB = b; mC = c;
}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.1.5,
que es la parte final de la solucin del ejercicio 5.1.
a) Parte 1: Como se puede ver en la primera parte del programa principal void
main se crean los objetos que representan a las diferentes figuras geomtricas
como son: ObjPunto2D, ObjCirculo, ObjRectangulo y ObjTriangulo, para lo cual
se utilizan los constructores por defecto o sin argumentos de cada una de las
clases que se instancian como son: Punto2D, Circulo, Rectangulo y Triangulo,
respectivamente.
b) Parte 2: En la segunda parte del programa principal simplemente se imprime
un grupo de mensajes para indicar que se va a trabajar con figuras geomticas.
c) Parte 3: En la tercera parte del programa principal se realiza toda la lectura de
datos con los objetos que representan a las cuatro figuras geomtricas en
cuestin que son: Punto, Crculo, Rectngulo y Tringulo. Cada objeto invoca a
su mtodo de lectura que se llama LeerDatos, el cual se encarga de leer los
datos que le corresponde de acuerdo a la figura geomtrica que representa.
d) Parte 4: En la cuarta parte del programa principal se realizan los clculos
matemticos y la impresin de resultados. Aqu cada objeto invoca a dos
mtodos: a) Mtodo Calcular, que se encarga de realizar los clculos
matemticos del rea y permetro de la figura a la que representa; b) Mtodo
ImprimirDatos, que se encarga de realizar la impresin de los resultados
obtenidos.
Tabla 5.1.5: Cdigo de la clase Programa de la aplicacin.
/*
* Cdigo del archivo Programa.java
*/

17

Programacin en Java para Ingenieros


package PaqueteFigurasGeometricas;
public class Programa
{
public static void main(String[] args)
{
// Parte 1: Creacin de objetos, utilizando constructores.
Punto2D ObjPunto2D = new Punto2D();
Circulo ObjCirculo = new Circulo();
Rectangulo ObjRectangulo = new Rectangulo();
Triangulo ObjTriangulo = new Triangulo();
// Parte 2: Impresin de mensajes de informacin.
System.out.printf("Figuras Geomtricas\n");
System.out.printf("==================\n\n");
// Parte 3: Lectura de datos.
System.out.printf(ObjPunto2D.getTipo());
ObjPunto2D.LeerDatos();
System.out.printf("\n");
System.out.printf(ObjCirculo.getTipo());
ObjCirculo.LeerDatos();
System.out.printf("\n");
System.out.printf(ObjRectangulo.getTipo());
ObjRectangulo.LeerDatos();
System.out.printf("\n");
System.out.printf(ObjTriangulo.getTipo());
ObjTriangulo.LeerDatos();
System.out.printf("\n\n");
// Parte 4: Clculos e impresin de resultados.
ObjPunto2D.ImprimirDatos();
System.out.printf("\n\n");
ObjCirculo.ImprimirDatos();
ObjCirculo.Calcular();
System.out.printf("\n");
ObjRectangulo.ImprimirDatos();
ObjRectangulo.Calcular();
System.out.printf("\n");
ObjTriangulo.ImprimirDatos();
ObjTriangulo.Calcular();
System.out.printf("\n");
}
}
Adicionalmente al cdigo del programa con todas sus clases, en la Figura 5.2, se
muestra el diagrama de clases de la aplicacin con notacin UML (Lenguaje de
Modelamiento Unificado Unified Modeling Language).
En las tablas 5.1.6 y 5.1.7 se muestra una de las salidas de este programa en el cual
justamente se ha instanciado algunos objetos los cuales invocan algunos mtodos. Lo
importante de este ejercicio es ver como las clases Circulo, Rectangulo y Triangulo
pueden llamar a los mtodos de la clase Punto2D, utilizando herencia.

18

Programacin en Java para Ingenieros


Punto2D
#mX : float
#mY : float

Circulo

Rectangulo

-mRadio : float

-mAncho : float
-mLargo : float

Triangulo
-mA : float
-mB : float
-mC : float

Figura 5.2. Diagrama de clases del Ejercicio 5.1.


Como se pueden ver los beneficios de la herencia son muchos, ya que si en este
ejercicio no se hubiese utilizado herencia se habra tenido duplicado todos los datos y
mtodos con sus implementaciones contenidas tanto en la clase Punto2D como en el
resto de clases; sin embargo, con la herencia se puede evitar la duplicidad de datos al
utilizar clases derivadas.
Tabla 5.1.6: Salida del programa.

19

Programacin en Java para Ingenieros


Tabla 5.1.7: Salida del programa.

5.4. Herencia Repetitiva


En la seccin anterior se utiliz herencia en una aplicacin de generacin simple, es
decir, padre e hijo. Naturalmente en este punto se puede plantear la interrogante de
que si se puede crear relaciones ms complejas, tales como abuelo, padre e hijo. De
hecho, se puede crear jerarquas de herencia tan largas como se requiera y no hay un
lmite impuesto.
A continuacin se plantea el Ejercicio 5.2 y algunas pautas para resolverlo y se lo deja
al programador para que lo concluya, donde se muestra el uso de herencia repetitiva.
Ejercicio 5.2: Escribir un programa que permita representar las siguientes figuras
geomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, d) cono, e) cilindro, f)
paraleleppedo, g) tetraedro y h) pirmide, utilizando herencia repetitiva.
Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular el
permetro, el rea y el volumen de esas figuras, segn corresponda, de acuerdo a las
siguientes frmulas matemticas:
Figura 2D

Nombre
Crculo

Datos
r = radio

Rectngulo

a = ancho
b = largo

Permetro

rea

b
a

20

Programacin en Java para Ingenieros


Tringulo
b

a, b, c = lados
s = semipermetro

)(

)(

Figura 3D

Nombre
Cono

rea

Volumen

h = altura
g = generatriz

Datos
r = radio de la base

Cilindro

r = radio de la base
h = altura

h
r

Paraleleppedo

a = ancho
b = largo
c = altura

Tetraedro

a = arista

Pirmide con
una
base
cuadrangular

a = arista de la base
b = arista del
tringulo issceles
ap = apotema
h = altura
PB = permetro de la
base
AB = rea de la base

b
a

a
a

a
a

b ap
a

La implementacin de todo este programa se lo realizar en un archivo de proyecto de


tipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_2, que
contiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene diez
clases las mismas que son: Punto3D, Circulo, Rectangulo, Triangulo, Cilindro, Cono,
Paraleleppedo, Tetraedro, Piramide y Programa, que son las clases con las cuales se
resolvern el presente ejercicio, tal y como lo muestra la Figura 5.3.

21

Programacin en Java para Ingenieros

Figura 5.3. Proyecto JavaConsolaPrograma_5_2.


El diagrama de clases de esta aplicacin se muestra en la Figura 5.4 con notacin UML.
En este diagrama se puede ver que la aplicacin est compuesta por una clase abuelo
que es la clase Punto3D y luego hay tres clases padres que son: Circulo, Rectangulo y
Triangulo, las cuales tienen a su vez sus propias clases hijas. Las clases Cono y
Cilindro son clases derivadas o hijas de la clase Circulo; la clase Paralelepipedo es
una clase hija de la clase Rectangulo; y las clases Tetraedro y Piramide son clases
derivadas o hijas de la clase Triangulo.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase se
omite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public class Punto3D {}
public class Circulo extends Punto3D {}
public class Cono extends Circulo {}
public class Cilindro extends Circulo {}
public class Rectangulo extends Punto3D {}
public class Paralelepipedo extends Rectangulo {}
public class Triangulo extends Punto3D {}
public class Tetraedro extends Triangulo {}
public class Piramide extends Triangulo {}

22

Programacin en Java para Ingenieros


Punto3D
#mX : float
#mY : float
#mZ : float

Circulo

Rectangulo

#mRadio : float

#mAncho : float
#mLargo : float

Cono

Cilindro

-mAltura : float
-mGeneratriz : float

-mAltura : float

Triangulo
#mA : float
#mB : float
#mC : float

Paralelepipedo
-mAltura : float

Tetraedro

Piramide
-mAltura : float
-mApotema : float

Figura 5.4. Diagrama de clases del Ejercicio 5.2.

5.5. Polimorfismo
El polimorfismo es la facultad de asumir muchas formas, refirindose a la facultad
de que con una sola sentencia se puede llamar a muchas funciones de objetos
diferentes heredados. El polimorfismo tiene la capacidad de llamar a una
variedad de funciones virtuales utilizando exactamente el mismo medio de acceso.
El polimorfismo se utiliza en una estructura de rbol de clases, en donde cada
clase derivada dentro de este rbol puede recibir uno o ms mensajes con el mismo
nombre, ya que cuando un objeto de una clase derivada dentro de este rbol recibe un
mensaje, este objeto determina la aplicacin particular del mensaje que resulta
apropiada. Esta caracterstica permite a cada objeto de una clase derivada responder a
un formato de mensaje de manera apropiada segn su definicin.

5.6. Funciones Abstractas o Virtuales


Cuando la clase base y sus clases derivadas tienen una funcin con el mismo nombre y
se desea llamar a una funcin de una clase especfica mediante la clase base, el
compilador no puede decidir cul funcin se llamar, ya que la clase base puede ser
utilizada para acceder a las funciones de las clases derivadas y el compilador no puede
comparar el tipo del objeto, por eso se define una funcin abstracta o virtual la cual
es invocada por la clase base, de acuerdo a la clase derivada a la que pertenece.
Cuando una clase contiene una funcin virtual, sta consta en una tabla virtual
(vtable o virtual table) manejada por el compilador, la cual internamente es un arreglo
de punteros con todas las direcciones de sus funciones virtuales.

23

Programacin en Java para Ingenieros


La funcin abstracta o virtual es una funcin miembro pblica o protegida de una
clase base que puede ser redefinida en cada una de las clases derivadas de sta, y una
vez redefinidas las funciones miembro en cada una de las clases derivadas, pueden ser
accedidas utilizando una tabla virtual manejada por la clase base. La funcin
abstracta o virtual se declara en la clase base y precediendo a su declaracin la
palabra clave abstract.

5.7. Clases Abstractas o Virtuales


Una clase abstracta o virtual es una clase que contiene funciones virtuales puras.
Una funcin virtual pura es una funcin virtual que es declarada en la clase base (la
clase abstracta) pero no es implementada en la clase base. Esto es responsabilidad de
las clases derivadas al sobrecargarse las funciones abstractas o virtuales y
proporcionan una implementacin para ellas.
Hay casos en los cuales es til definir clases en las cuales el programador nunca
intenta instanciar ningn objeto. Tales clases se pueden definir como abstractas o
virtuales, porque son utilizadas como superclases en situaciones de herencia, que
normalmente se refieren a ellas como superclases abstractas, donde ningn objeto de
la superclases puede ser instanciado. Una clase abstracta o virtual se declara como
la clase base de la aplicacin y precediendo a su declaracin la palabra clave abstract.
En el Ejercicio 5.3 se va a mostrar el uso del polimorfismo, funciones abstractas y
clases abstractas, de acuerdo a lo que se plantea en ese ejercicio.
Ejercicio 5.3: Escribir un programa que permita representar las siguientes figuras
geomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando herencia,
polimorfismo, funciones abstractas y clases abstractas. Adicionalmente ubicar a cada
figura en una coordenada cartesiana y luego calcular el permetro y el rea de esas
figuras, de acuerdo a las siguientes frmulas matemticas:
Figura

Nombre
Crculo

Datos
r = radio

Rectngulo

a = ancho
b = largo

Tringulo

a, b, c = lados
s = semipermetro

Permetro

rea

b
a

)(

)(

La implementacin de todo este programa se lo realizar en un archivo de proyecto de


tipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_3, que
contiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene seis

24

Programacin en Java para Ingenieros


clases las mismas que son: Figura, Punto2D, Circulo, Rectangulo, Triangulo y
Programa, que son las clases con las cuales se resolvern el presente ejercicio, tal y
como lo muestra la Figura 5.4.

Figura 5.4. Proyecto JavaConsolaPrograma_5_3.


El diagrama de clases de esta aplicacin se muestra en la Figura 5.5 con notacin UML.
En este diagrama se puede ver que la aplicacin est compuesta por una clase abuelo
que viene a ser una clase abstracta y la base para el resto de clases, la cual es la clase
Figura y luego hay una clase padre que es Punto2D, la cual tiene tres clases hijas:
Circulo, Rectangulo y Triangulo.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase se
omite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public abstract class Figura {}
public class Punto2D extends Figura {}
public class Circulo extends Punto2D {}
public class Rectangulo extends Punto2D {}
public class Triangulo extends Punto2D {}
Para resolver este ejercicio, primeramente se va crear una clase abstracta o virtual
llamada Figura de la cual se deriva la clase Punto2D y de la cual a su vez se derivan el
resto de clases que son Circulo, Rectangulo y Triangulo.
La clase Figura contiene la implentacin de los mtodos Area, Perimetro y Calcular, y
estas implementaciones son heredables, por lo que pueden ser usadas por las
subclases. Esta clase tambin proporciona tres mtodos abstractos que son getTipo,
LeerDatos e ImprimirDatos, los cuales indican que sern implementados en cada
subclase pero no en la superclase.
La implementacin de la clase Figura, se presenta a continuacin en la tabla 5.3.1,
que es parte de la solucin del ejercicio 5.3.

25

Programacin en Java para Ingenieros


Figura
+Area() : float
+Perimetro() : float
+Calcular() : void
+abstract getTipo() : string
+abstract LeerDatos() : void
+abstract ImprimirDatos() : void

Punto2D
#mX : float
#mY : float

Circulo

Rectangulo

-mRadio : float

-mAncho : float
-mLargo : float

Triangulo
-mA : float
-mB : float
-mC : float

Figura 5.5. Diagrama de clases del Ejercicio 5.3.


Tabla 5.3.1: Cdigo de la clase Figura del programa.
/*
* Cdigo del archivo Figura.java
*/
package PaqueteFigurasGeometricas;
public abstract class Figura
{
public float Area()
{ return 0.0f; }
public float Perimetro()
{ return 0.0f; }
public void Calcular()
{ System.out.printf("\n" + "Operaciones y clculos sin definir" + "\n"); };
public abstract String getTipo();
public abstract void LeerDatos();
public abstract void ImprimirDatos();
}
La implementacin de la clase derivada Punto2D, se presenta a continuacin en la tabla
5.3.2, que es parte de la solucin del ejercicio 5.3.
Esta clase posee un grupo de atributos y mtodos que pueden ser heredables y
utilizados por las clases derivadas de Punto2D, as como tambin se pueden definir las
funciones abstractas o virtuales de la clase base que es la clase Figura, tanto en esta
clase como en las clases derivadas de Punto2D.

26

Programacin en Java para Ingenieros


Tabla 5.3.2: Cdigo de la clase Punto2D del programa.
/*
* Cdigo del archivo Punto2D.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Punto2D extends Figura
{
// Atributos de la clase.
protected float mX;
protected float mY;
// Mtodos de la clase.
// Constructor sin argumentos.
public Punto2D()
{
setX(0); setY(0);
}
// Constructor con dos argumentos.
public Punto2D(float x, float y)
{
setX(x); setY(y);
}
// Funcin que obtiene la coordenada 'x' de un punto.
public float getX()
{
return mX;
}
// Funcin que inicializa la coordenada 'x' de un punto.
public void setX(float x)
{
this.mX = x;
}
// Funcin que obtiene la coordenada 'y' de un punto.
public float getY()
{
return mY;
}
// Funcin que inicializa la coordenada 'y' de un punto.
public void setY(float y)
{
this.mY = y;
}

27

Programacin en Java para Ingenieros


// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Punto\n");
}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.
public String getCoordenadas()
{
return("(" + getX() + ", " + getY() + ")");
}
// Funcin que imprime los datos de un punto.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getCoordenadas());
}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.
public void LeerDatos()
{
String sData = "";
try
{
System.out.printf("Ingrese el valor de la coordenada x: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mX = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor de la coordenada y: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mY = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla
5.3.3, que es parte de la solucin del ejercicio 5.3.

28

Programacin en Java para Ingenieros


Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
clase abstracta.
Tabla 5.3.3: Cdigo de la clase Circulo del programa.
/*
* Cdigo del archivo Circulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Circulo extends Punto2D
{
// Atributos de la clase.
private float mRadio;
// Mtodos de la clase.
// Constructor sin argumentos.
public Circulo()
{
super(0.0f, 0.0f);
setRadio(0.0f);
}
// Constructor con tres argumentos.
public Circulo(float x, float y, float r)
{
super(x, y);
setRadio(r);
}
// Funcin que obtiene el radio de un crculo.
public float getRadio()
{
return mRadio;
}
// Funcin que inicializa el radio de un crculo.
public void setRadio(float radio)
{
// Se verifica que el radio del crculo no sea negativo.
if(radio >= 0)
{
this.mRadio = radio;
}
else

29

Programacin en Java para Ingenieros


{
this.mRadio = 0.0f;
}
}
// Funcin que calcula el rea de un crculo.
public float Area()
{
return((float)Math.PI * mRadio * mRadio);
}
// Funcin que calcula el permetro de un crculo.
public float Perimetro()
{
return(2 * (float)Math.PI * mRadio);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un crculo e imprime esos resultados.
public void Calcular()
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Crculo\n");
}
// Funcin que obtiene los datos de un crculo y los imprime por
// pantalla en forma de cadena.
public String getDatosCirculo()
{
return("Centro = " + super.getCoordenadas() +
"; Radio = " + getRadio());
}
// Funcin que imprime los datos de un crculo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosCirculo());
}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del radio: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);

30

Programacin en Java para Ingenieros


sData = streamInput.readLine();
mRadio = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en la
tabla 5.3.4, que es parte de la solucin del ejercicio 5.3.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
clase abstracta.
Tabla 5.3.4: Cdigo de la clase Rectangulo del programa.
/*
* Cdigo del archivo Rectangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Rectangulo extends Punto2D
{
// Atributos de la clase.
private float mAncho;
private float mLargo;
// Mtodos de la clase.
// Constructor sin argumentos.
public Rectangulo()
{
super(0.0f, 0.0f);
setAncho(0.0f);
setLargo(0.0f);
}
// Constructor con dos argumentos.
public Rectangulo(float x, float y, float ancho, float largo)
{
super(x, y);
setAncho(ancho);
setLargo(largo);
}

31

Programacin en Java para Ingenieros


// Funcin que obtiene la base de un rectngulo.
public float getAncho()
{
return mAncho;
}
// Funcin que inicializa la base de un rectngulo.
public void setAncho(float ancho)
{
// Se verifica que el ancho del rectngulo no sea negativo.
if(ancho >= 0)
{
this.mAncho = ancho;
}
else
{
this.mAncho = 0.0f;
}
}
// Funcin que obtiene la altura de un rectngulo.
public float getLargo()
{
return mLargo;
}
// Funcin que inicializa la altura de un rectngulo.
public void setLargo(float largo)
{
// Se verifica que el largo del rectngulo no sea negativo.
if(largo >= 0)
{
this.mLargo = largo;
}
else
{
this.mLargo = 0.0f;
}
}
// Funcin que calcula el rea de un rectngulo.
public float Area()
{
return(mAncho * mLargo);
}
// Funcin que calcula el permetro de un rectngulo.
public float Perimetro()
{
return(2 * mAncho + 2 * mLargo);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un rectngulo e imprime esos resultados.

32

Programacin en Java para Ingenieros


public void Calcular()
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Rectngulo\n");
}
// Funcin que obtiene los datos de un rectngulo y los imprime por
// pantalla en forma de cadena.
public String getDatosRectangulo()
{
return("Vrtice = " + super.getCoordenadas() +
"; Ancho = " + getAncho() +
"; Largo = " + getLargo());
}
// Funcin que imprime los datos de un rectngulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosRectangulo());
}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo
// de un rectngulo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del ancho: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mAncho = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del largo: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mLargo = Float.parseFloat(sData);

33

Programacin en Java para Ingenieros


}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en la
tabla 5.3.5, que es parte de la solucin del ejercicio 5.3.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
clase abstracta.
Tabla 5.3.5: Cdigo de la clase Triangulo del programa.
/*
* Cdigo del archivo Triangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Triangulo extends Punto2D
{
// Atributos de la clase.
private float mA;
private float mB;
private float mC;
// Mtodos de la clase.
// Constructor sin argumentos.
public Triangulo()
{
super(0.0f, 0.0f);
setA(0.0f);
setB(0.0f);
setC(0.0f);
}
// Constructor con cuatro argumentos.
public Triangulo(float x, float y, float a, float b, float c)
{
super(x, y);
setA(a);
setB(b);
setC(c);

34

Programacin en Java para Ingenieros


}
// Funcin que obtiene el lado 'a' del tringulo.
public float getA()
{
return mA;
}
// Funcin que inicializa el lado 'a' del tringulo.
public void setA(float a)
{
// Se verifica que el lado 'a' del tringulo no sea negativo.
if(a >= 0)
{
this.mA = a;
}
else
{
this.mA = 0.0f;
}
}
// Funcin que obtiene el lado 'b' del tringulo.
public float getB()
{
return mB;
}
// Funcin que inicializa el lado 'b' del tringulo.
public void setB(float b)
{
// Se verifica que el lado 'b' del tringulo no sea negativo.
if(b >= 0)
{
this.mB = b;
}
else
{
this.mB = 0.0f;
}
}
// Funcin que obtiene el lado 'c' del tringulo.
public float getC()
{
return mC;
}
// Funcin que inicializa el lado 'c' del tringulo.
public void setC(float c)
{
// Se verifica que el lado 'c' del tringulo no sea negativo.
if(c >= 0)
{
this.mC = c;

35

Programacin en Java para Ingenieros


}
else
{
this.mC = 0.0f;
}
}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.
public float Area()
{
float s = Semiperimetro(mA, mB, mC);
return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.
private static float Semiperimetro(float a, float b, float c)
{
return((a + b + c) / 2);
}
// Funcin que calcula el permetro de un tringulo.
public float Perimetro()
{
return(2 * Semiperimetro(mA, mB, mC));
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un tringulo e imprime esos resultados.
public void Calcular()
{
// Se verifica la existencia de un tringulo, comprobando que la suma
// de cualquiera de los dos lados de un tringulo sea mayor que el
// tercer lado.
if((mA + mB > mC) && (mA + mC > mB) && (mB + mC > mA))
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
else
{
System.out.printf("El tringulo no existe...\n");
}
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Tringulo\n");
}
// Funcin que obtiene los datos de un tringulo y los imprime por
// pantalla en forma de cadena.
public String getDatosTriangulo()
{
return("Vrtice = " + super.getCoordenadas() +

36

Programacin en Java para Ingenieros


"; Lado 'a' = " + getA() +
"; Lado 'b' = " + getB() +
"; Lado 'c' = " + getC());
}
// Funcin que imprime los datos de un tringulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosTriangulo());
}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del lado 'a': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mA = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del lado 'b': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mB = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del lado 'c': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mC = Float.parseFloat(sData);
}
catch(IOException e)
{

37

Programacin en Java para Ingenieros


System.err.println("Error: " + e.getMessage());
}
}
// Funcin con parmetros que inicializa las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera, utilizando
// los parmetros 'a', 'b' y 'c' que son asignados a los datos miembro
// de la clase.
public void setLadosTriangulo(float a, float b, float c)
{
mA = a; mB = b; mC = c;
}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.3.6,
que es la parte final de la solucin del ejercicio 5.3.
a) Parte 1: Como se puede ver en la primera parte de la clase Programa, en la
seccin de atributos o datos miembro de clase, se declaran los objetos que
representan a las diferentes figuras geomtricas como son: ObjPunto2D,
ObjCirculo, ObjRectangulo y ObjTriangulo. Adems se declara un arreglo de
objetos de tipo Figura, llamado ArrayDeFiguras, donde se almacenarn luego
todos los objetos que representan a las figuras geomtricas.
b) Parte 2: En la segunda parte de la clase Programa, en la seccin del programa
principal principal void main simplemente se imprime un grupo de
mensajes para indicar que se va a trabajar con figuras geomticas.
c) Parte 3: En la tercera parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica Inicializar, la
cual se encarga de crear e inicializar los objetos que representan a las figuras
geomtricas, los cuales son: ObjPunto2D, ObjCirculo, ObjRectangulo y
ObjTriangulo. Adems se crea y se inicializa un arreglo de objetos de tipo
Figura de tamao cuatro, llamado ArrayDeFiguras, donde en cada casillero del
arreglo se almacena una de las figuras geomtricas antes indicadas utilizando
cada uno de los objetos que representan a dichas figuras.
d) Parte 4: En la cuarta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica LeerDatos, la
cual utiliza un bucle para obtener el tipo de figura y leer los datos
correspondientes a cada figura geomtrica, utilizando el arreglo de objetos de
tipo Figura, llamado ArrayDeFiguras, invoca a dos mtodos: a) Mtodo
getTipo, que se encarga de obtener el tipo de la figura geomtrica a la cual
representa; b) Mtodo LeerDatos, que se encarga de leer los datos que le
corresponde de acuerdo a la figura geomtrica que representa. En este
apartado se utiliza el polimorfismo para asumir la forma de la figura
correspondiente.
e) Parte 5: En la quinta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica
ImprimirDatosYCalculos, donde se realizan los clculos matemticos y la
impresin de resultados. Aqu el arreglo de objetos de tipo Figura, llamado
ArrayDeFiguras, invoca a dos mtodos: a) Mtodo Calcular, que se encarga de
realizar los clculos matemticos del rea y permetro de la figura a la que
representa; b) Mtodo ImprimirDatos, que se encarga de realizar la impresin
de los resultados obtenidos. En este apartado tambin se utiliza el polimorfismo
para asumir la forma de la figura correspondiente.

38

Programacin en Java para Ingenieros


Tabla 5.3.6: Cdigo de la clase Programa de la aplicacin.
/*
* Cdigo del archivo Programa.java
*/
package PaqueteFigurasGeometricas;
public class Programa
{
// Parte 1: Declaracin de objetos.
private static Punto2D ObjPunto2D;
private static Circulo ObjCirculo;
private static Rectangulo ObjRectangulo;
private static Triangulo ObjTriangulo;
private static Figura ArrayDeFiguras[];
public static void main(String[] args)
{
// Parte 2: Impresin de mensajes de informacin.
System.out.printf("Figuras Geomticas\n");
System.out.printf("==================\n\n");
// Parte 3: Inicializacin de objetos.
// Llamada a la funcin Inicializar.
Inicializar();
// Parte 4: Lectura de datos.
// Llamada a la funcin LeerDatos.
LeerDatos();
System.out.printf("\n");
// Parte 5: Clculos e impresin de resultados.
// Llamada a la funcin ImprimirDatosYCalculos.
ImprimirDatosYCalculos();
}
// Funcin que permite crear e incializar objetos y un arreglo
// de objetos que contiene a todo el resto de objetos.
public static void Inicializar()
{
ObjPunto2D = new Punto2D();
ObjCirculo = new Circulo();
ObjRectangulo = new Rectangulo();
ObjTriangulo = new Triangulo();
ArrayDeFiguras = new Figura[4];
ArrayDeFiguras[0]
ArrayDeFiguras[1]
ArrayDeFiguras[2]
ArrayDeFiguras[3]

=
=
=
=

ObjPunto2D;
ObjCirculo;
ObjRectangulo;
ObjTriangulo;

}
// Funcin que permite leer los datos de los objetos a travs

39

Programacin en Java para Ingenieros


// de un arreglo de objetos.
public static void LeerDatos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
System.out.printf(ArrayDeFiguras[i].getTipo());
ArrayDeFiguras[i].LeerDatos();
System.out.printf("\n");
}
}
// Funcin que permite imprimir los datos de los objetos a travs
// de un arreglo de objetos.
public static void ImprimirDatosYCalculos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
ArrayDeFiguras[i].ImprimirDatos();
ArrayDeFiguras[i].Calcular();
System.out.printf("\n");
}
}
}
En las tablas 5.3.7 y 5.3.8 se muestra una de las salidas de este programa en el cual
justamente se ha utilizado un arreglo de objetos para instanciar o crear los objetos que
representan a las diferentes figuras geomtricas. Lo interesante de este ejercicio es
ver como trabaja una clase abstracta con funciones abstractas y ver como las clases
derivadas implementan las funciones de una clase abstracta.
Tabla 5.3.7: Salida del programa.

40

Programacin en Java para Ingenieros


Tabla 5.3.8: Salida del programa.

Nota:

En este ejemplo presentado, la herencia no cumple la misma semntica, ya


que lo ideal bubiese sido que la clase Figura estese compuesta de un objeto
de la clase Punto2D, y por motivos didcticos se procedi de esa manera.

5.8. Interfaces
Una interface es una coleccin de mtodos abstractos y propiedades. Todos los
mtodos que se declaran en una interface son siempre pblicos o public. Las
interfaces tambin pueden contener datos definidos como public final static. Para
usar una interface, una clase debe especificar que va a implementar la interface
utilizando la palabra reservada implements y la clase debe definir cada mtodo con el
nmero de parmetros y el tipo de retorno especificaco en la definicin de la interface.
La principal diferencia entre interface y abstract es que una interface proporciona un
mecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario a
utilizar la herencia.
En el Ejercicio 5.4 se va a mostrar el uso de las interfaces, de acuerdo a lo que se
plantea en ese ejercicio.
Ejercicio 5.4: Escribir un programa que permita representar las siguientes figuras
geomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando interfaces.
Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular el
permetro y el rea de esas figuras, de acuerdo a las siguientes frmulas matemticas:
Figura

Nombre
Crculo

Datos
r = radio

Permetro

rea

41

Programacin en Java para Ingenieros


Rectngulo

a = ancho
b = largo

Tringulo

a, b, c = lados
s = semipermetro

b
a

)(

)(

La implementacin de todo este programa se lo realizar en un archivo de proyecto de


tipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_4, que
contiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene una
interface llamada Figura y cinco clases las mismas que son: Punto2D, Circulo,
Rectangulo, Triangulo y Programa, que son las clases con las cuales se resolvern el
presente ejercicio, tal y como lo muestra la Figura 5.4.

Figura 5.4. Proyecto JavaConsolaPrograma_5_4.


El diagrama de clases de esta aplicacin se muestra en la Figura 5.6 con notacin UML.
En este diagrama se puede ver que la aplicacin est compuesta por una interface
llamada Figura, la cual se implementa en la clase Punto2D y que a su vez tiene tres
clases hijas: Circulo, Rectangulo y Triangulo; las mismas que tambin pueden
acceder a la interface Figura.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase se
omite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
interface Figura {}
public class Punto2D implements Figura {}
public class Circulo extends Punto2D {}
public class Rectangulo extends Punto2D {}
public class Triangulo extends Punto2D {}

42

Programacin en Java para Ingenieros


Punto2D

Figura

#mX : float
#mY : float
+Area() : float
+Perimetro() : float
+Calcular() : void
+getTipo() : string
+LeerDatos() : void
+ImprimirDatos() : void

Circulo

Rectangulo

-mRadio : float

-mAncho : float
-mLargo : float

Triangulo
-mA : float
-mB : float
-mC : float

Figura 5.6. Diagrama de clases del Ejercicio 5.4.


Para resolver este ejercicio, primeramente se va a crear una interface llamada Figura,
la cual se va a implementar en la clase padre Punto2D y de la cual a su vez se derivan
el resto de clases que son Circulo, Rectangulo y Triangulo.
La interface Figura contiene la declaracin de los mtodos Area, Perimetro, getTipo,
LeerDatos e ImprimirDatos y Calcular. Estos mtodos pueden ser implementados tanto
en la clase Punto2D como en sus clases hijas: Circulo, Rectangulo y Triangulo.
La implementacin de la interface Figura, se presenta a continuacin en la tabla 5.4.1,
que es parte de la solucin del ejercicio 5.4.
Tabla 5.4.1: Cdigo de la interface Figura del programa.
/*
* Cdigo del archivo Figura.java
*/
package PaqueteFigurasGeometricas;
interface Figura
{
public float Area();
public float Perimetro();
public void Calcular();
public String getTipo();
public void LeerDatos();
public void ImprimirDatos();
}
La implementacin de la clase padre Punto2D, se presenta a continuacin en la tabla
5.4.2, que es parte de la solucin del ejercicio 5.4.

43

Programacin en Java para Ingenieros


Esta clase posee un grupo de atributos y mtodos que pueden ser heredables y
utilizados por las clases derivadas de Punto2D, as como tambin se pueden
implementar los mtodos de la interface Figura, tanto en esta clase como en las clases
derivadas de Punto2D.
Tabla 5.4.2: Cdigo de la clase Punto2D del programa.
/*
* Cdigo del archivo Punto2D.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Punto2D implements Figura
{
// Atributos de la clase.
protected float mX;
protected float mY;
// Mtodos de la clase.
// Constructor sin argumentos.
public Punto2D()
{
setX(0); setY(0);
}
// Constructor con dos argumentos.
public Punto2D(float x, float y)
{
setX(x); setY(y);
}
// Funcin que obtiene la coordenada 'x' de un punto.
public float getX()
{
return mX;
}
// Funcin que inicializa la coordenada 'x' de un punto.
public void setX(float x)
{
this.mX = x;
}
// Funcin que obtiene la coordenada 'y' de un punto.
public float getY()
{
return mY;
}

44

Programacin en Java para Ingenieros


// Funcin que inicializa la coordenada 'y' de un punto.
public void setY(float y)
{
this.mY = y;
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Punto\n");
}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.
public String getCoordenadas()
{
return("(" + getX() + ", " + getY() + ")");
}
// Funcin que imprime los datos de un punto.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getCoordenadas());
}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.
public void LeerDatos()
{
String sData = "";
try
{
System.out.printf("Ingrese el valor de la coordenada x: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mX = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor de la coordenada y: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mY = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}

45

Programacin en Java para Ingenieros


}
// Funcin que retorna un valor arbitrario de cero.
public float Area()
{ return 0.0f; }
// Funcin que retorna un valor arbitrario de cero.
public float Perimetro()
{ return 0.0f; }
// Funcin que imprime un mensaje por defecto.
public void Calcular()
{ System.out.printf("\n" + "Operaciones y clculos sin definir" + "\n"); }
}
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla
5.4.3, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
interface Figura.
Tabla 5.4.3: Cdigo de la clase Circulo del programa.
/*
* Cdigo del archivo Circulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Circulo extends Punto2D
{
// Atributos de la clase.
private float mRadio;
// Mtodos de la clase.
// Constructor sin argumentos.
public Circulo()
{
super(0.0f, 0.0f);
setRadio(0.0f);
}
// Constructor con tres argumentos.
public Circulo(float x, float y, float r)
{
super(x, y);

46

Programacin en Java para Ingenieros


setRadio(r);
}
// Funcin que obtiene el radio de un crculo.
public float getRadio()
{
return mRadio;
}
// Funcin que inicializa el radio de un crculo.
public void setRadio(float radio)
{
// Se verifica que el radio del crculo no sea negativo.
if(radio >= 0)
{
this.mRadio = radio;
}
else
{
this.mRadio = 0.0f;
}
}
// Funcin que calcula el rea de un crculo.
public float Area()
{
return((float)Math.PI * mRadio * mRadio);
}
// Funcin que calcula el permetro de un crculo.
public float Perimetro()
{
return(2 * (float)Math.PI * mRadio);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un crculo e imprime esos resultados.
public void Calcular()
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Crculo\n");
}
// Funcin que obtiene los datos de un crculo y los imprime por
// pantalla en forma de cadena.
public String getDatosCirculo()
{
return("Centro = " + super.getCoordenadas() +
"; Radio = " + getRadio());

47

Programacin en Java para Ingenieros


}
// Funcin que imprime los datos de un crculo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosCirculo());
}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del radio: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mRadio = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en la
tabla 5.4.4, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
interface Figura.
Tabla 5.4.4: Cdigo de la clase Rectangulo del programa.
/*
* Cdigo del archivo Rectangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Rectangulo extends Punto2D
{
// Atributos de la clase.
private float mAncho;
private float mLargo;

48

Programacin en Java para Ingenieros


// Mtodos de la clase.
// Constructor sin argumentos.
public Rectangulo()
{
super(0.0f, 0.0f);
setAncho(0.0f);
setLargo(0.0f);
}
// Constructor con dos argumentos.
public Rectangulo(float x, float y, float ancho, float largo)
{
super(x, y);
setAncho(ancho);
setLargo(largo);
}
// Funcin que obtiene la base de un rectngulo.
public float getAncho()
{
return mAncho;
}
// Funcin que inicializa la base de un rectngulo.
public void setAncho(float ancho)
{
// Se verifica que el ancho del rectngulo no sea negativo.
if(ancho >= 0)
{
this.mAncho = ancho;
}
else
{
this.mAncho = 0.0f;
}
}
// Funcin que obtiene la altura de un rectngulo.
public float getLargo()
{
return mLargo;
}
// Funcin que inicializa la altura de un rectngulo.
public void setLargo(float largo)
{
// Se verifica que el largo del rectngulo no sea negativo.
if(largo >= 0)
{
this.mLargo = largo;
}
else
{

49

Programacin en Java para Ingenieros


this.mLargo = 0.0f;
}
}
// Funcin que calcula el rea de un rectngulo.
public float Area()
{
return(mAncho * mLargo);
}
// Funcin que calcula el permetro de un rectngulo.
public float Perimetro()
{
return(2 * mAncho + 2 * mLargo);
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un rectngulo e imprime esos resultados.
public void Calcular()
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Rectngulo\n");
}
// Funcin que obtiene los datos de un rectngulo y los imprime por
// pantalla en forma de cadena.
public String getDatosRectangulo()
{
return("Vrtice = " + super.getCoordenadas() +
"; Ancho = " + getAncho() +
"; Largo = " + getLargo());
}
// Funcin que imprime los datos de un rectngulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosRectangulo());
}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo
// de un rectngulo.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{

50

Programacin en Java para Ingenieros


System.out.printf("Ingrese el valor del ancho: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mAncho = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del largo: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mLargo = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en la
tabla 5.4.5, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y en
donde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada super y finalmente se puede implementar todas las funciones de la
interface Figura.
Tabla 5.4.5: Cdigo de la clase Triangulo del programa.
/*
* Cdigo del archivo Triangulo.java
*/
package PaqueteFigurasGeometricas;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class Triangulo extends Punto2D
{
// Atributos de la clase.
private float mA;
private float mB;
private float mC;

51

Programacin en Java para Ingenieros


// Mtodos de la clase.
// Constructor sin argumentos.
public Triangulo()
{
super(0.0f, 0.0f);
setA(0.0f);
setB(0.0f);
setC(0.0f);
}
// Constructor con cuatro argumentos.
public Triangulo(float x, float y, float a, float b, float c)
{
super(x, y);
setA(a);
setB(b);
setC(c);
}
// Funcin que obtiene el lado 'a' del tringulo.
public float getA()
{
return mA;
}
// Funcin que inicializa el lado 'a' del tringulo.
public void setA(float a)
{
// Se verifica que el lado 'a' del tringulo no sea negativo.
if(a >= 0)
{
this.mA = a;
}
else
{
this.mA = 0.0f;
}
}
// Funcin que obtiene el lado 'b' del tringulo.
public float getB()
{
return mB;
}
// Funcin que inicializa el lado 'b' del tringulo.
public void setB(float b)
{
// Se verifica que el lado 'b' del tringulo no sea negativo.
if(b >= 0)
{
this.mB = b;
}
else

52

Programacin en Java para Ingenieros


{
this.mB = 0.0f;
}
}
// Funcin que obtiene el lado 'c' del tringulo.
public float getC()
{
return mC;
}
// Funcin que inicializa el lado 'c' del tringulo.
public void setC(float c)
{
// Se verifica que el lado 'c' del tringulo no sea negativo.
if(c >= 0)
{
this.mC = c;
}
else
{
this.mC = 0.0f;
}
}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.
public float Area()
{
float s = Semiperimetro(mA, mB, mC);
return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.
private static float Semiperimetro(float a, float b, float c)
{
return((a + b + c) / 2);
}
// Funcin que calcula el permetro de un tringulo.
public float Perimetro()
{
return(2 * Semiperimetro(mA, mB, mC));
}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un tringulo e imprime esos resultados.
public void Calcular()
{
// Se verifica la existencia de un tringulo, comprobando que la suma
// de cualquiera de los dos lados de un tringulo sea mayor que el
// tercer lado.
if((mA + mB > mC) && (mA + mC > mB) && (mB + mC > mA))
{
System.out.printf("\n" + "Permetro = " + Perimetro() + "\n");
System.out.printf("rea = " + Area() + "\n");

53

Programacin en Java para Ingenieros


}
else
{
System.out.printf("El tringulo no existe...\n");
}
}
// Funcin que obtiene el tipo de figura geomtrica.
public String getTipo()
{
return("Tringulo\n");
}
// Funcin que obtiene los datos de un tringulo y los imprime por
// pantalla en forma de cadena.
public String getDatosTriangulo()
{
return("Vrtice = " + super.getCoordenadas() +
"; Lado 'a' = " + getA() +
"; Lado 'b' = " + getB() +
"; Lado 'c' = " + getC());
}
// Funcin que imprime los datos de un tringulo.
public void ImprimirDatos()
{
System.out.printf(getTipo() + getDatosTriangulo());
}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera.
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el valor del lado 'a': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mA = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del lado 'b': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);

54

Programacin en Java para Ingenieros


sData = streamInput.readLine();
mB = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el valor del lado 'c': ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mC = Float.parseFloat(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
// Funcin con parmetros que inicializa las coordenadas 'x' e 'y',
// los lados 'a', 'b' y 'c' de un tringulo cualquiera, utilizando
// los parmetros 'a', 'b' y 'c' que son asignados a los datos miembro
// de la clase.
public void setLadosTriangulo(float a, float b, float c)
{
mA = a; mB = b; mC = c;
}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.4.6,
que es la parte final de la solucin del ejercicio 5.4.
a) Parte 1: Como se puede ver en la primera parte de la clase Programa, en la
seccin de atributos o datos miembro de clase, se declaran los objetos que
representan a las diferentes figuras geomtricas como son: ObjPunto2D,
ObjCirculo, ObjRectangulo y ObjTriangulo. Adems se declara un arreglo de
objetos de tipo Figura, llamado ArrayDeFiguras, donde se almacenarn luego
todos los objetos que representan a las figuras geomtricas.
b) Parte 2: En la segunda parte de la clase Programa, en la seccin del programa
principal principal void main simplemente se imprime un grupo de
mensajes para indicar que se va a trabajar con figuras geomticas.
c) Parte 3: En la tercera parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica Inicializar, la
cual se encarga de crear e inicializar los objetos que representan a las figuras
geomtricas, los cuales son: ObjPunto2D, ObjCirculo, ObjRectangulo y
ObjTriangulo. Adems se crea y se inicializa un arreglo de objetos de tipo
Figura de tamao cuatro, llamado ArrayDeFiguras, donde en cada casillero del
arreglo se almacena una de las figuras geomtricas antes indicadas utilizando
cada uno de los objetos que representan a dichas figuras.
d) Parte 4: En la cuarta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica LeerDatos, la

55

Programacin en Java para Ingenieros


cual utiliza un bucle para obtener el tipo de figura y leer los datos
correspondientes a cada figura geomtrica, utilizando el arreglo de objetos de
tipo Figura, llamado ArrayDeFiguras, invoca a dos mtodos: a) Mtodo
getTipo, que se encarga de obtener el tipo de la figura geomtrica a la cual
representa; b) Mtodo LeerDatos, que se encarga de leer los datos que le
corresponde de acuerdo a la figura geomtrica que representa. En este
apartado se utiliza el polimorfismo para asumir la forma de la figura
correspondiente.
e) Parte 5: En la quinta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica
ImprimirDatosYCalculos, donde se realizan los clculos matemticos y la
impresin de resultados. Aqu el arreglo de objetos de tipo Figura, llamado
ArrayDeFiguras, invoca a dos mtodos: a) Mtodo Calcular, que se encarga de
realizar los clculos matemticos del rea y permetro de la figura a la que
representa; b) Mtodo ImprimirDatos, que se encarga de realizar la impresin
de los resultados obtenidos. En este apartado tambin se utiliza el polimorfismo
para asumir la forma de la figura correspondiente.
Tabla 5.4.6: Cdigo de la clase Programa de la aplicacin.
/*
* Cdigo del archivo Programa.java
*/
package PaqueteFigurasGeometricas;
public class Programa
{
// Parte 1: Declaracin de objetos.
private static Punto2D ObjPunto2D;
private static Circulo ObjCirculo;
private static Rectangulo ObjRectangulo;
private static Triangulo ObjTriangulo;
private static Figura ArrayDeFiguras[];
public static void main(String[] args)
{
// Parte 2: Impresin de mensajes de informacin.
System.out.printf("Figuras Geomticas\n");
System.out.printf("==================\n\n");
// Parte 3: Inicializacin de objetos.
// Llamada a la funcin Inicializar.
Inicializar();
// Parte 4: Lectura de datos.
// Llamada a la funcin LeerDatos.
LeerDatos();
System.out.printf("\n");
// Parte 5: Clculos e impresin de resultados.
// Llamada a la funcin ImprimirDatosYCalculos.
ImprimirDatosYCalculos();
}

56

Programacin en Java para Ingenieros


// Funcin que permite crear e incializar objetos y un arreglo
// de objetos que contiene a todo el resto de objetos.
public static void Inicializar()
{
ObjPunto2D = new Punto2D();
ObjCirculo = new Circulo();
ObjRectangulo = new Rectangulo();
ObjTriangulo = new Triangulo();
ArrayDeFiguras = new Figura[4];
ArrayDeFiguras[0]
ArrayDeFiguras[1]
ArrayDeFiguras[2]
ArrayDeFiguras[3]

=
=
=
=

ObjPunto2D;
ObjCirculo;
ObjRectangulo;
ObjTriangulo;

}
// Funcin que permite leer los datos de los objetos a travs
// de un arreglo de objetos.
public static void LeerDatos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
System.out.printf(ArrayDeFiguras[i].getTipo());
ArrayDeFiguras[i].LeerDatos();
System.out.printf("\n");
}
}
// Funcin que permite imprimir los datos de los objetos a travs
// de un arreglo de objetos.
public static void ImprimirDatosYCalculos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
ArrayDeFiguras[i].ImprimirDatos();
ArrayDeFiguras[i].Calcular();
System.out.printf("\n");
}
}
}
En las tablas 5.4.7 y 5.4.8 se muestra una de las salidas de este programa en el cual
justamente se ha utilizado un arreglo de objetos para instanciar o crear los objetos que
representan a las diferentes figuras geomtricas. Lo importante de este ejercicio es ver
como trabaja una interface con mtodos pblicos abstractos y ver como una clase base
y sus clases derivadas implementan las funciones de la interface.

57

Programacin en Java para Ingenieros


Tabla 5.4.7: Salida del programa.

Tabla 5.4.8: Salida del programa.

5.9. Resumen
La herencia permite a una clase derivada (tambin llamada clase hija o subclase)
heredar datos y mtodos de una clase base (tambin llamada clase padre o
superclase). De este modo, se puede solamente escribir una vez el cdigo general
compartido y se lo puede pasar a lo largo de las clases especficas a travs de la
herencia, permitiendo de esta manera ahorrar trabajo y reutilizar cdigo. Adems,
desde el punto de vista de la programacin orientada a objetos en Java, la herencia
permite modelar el mundo real utilizando objetos y relaciones entre ellos con cdigo de
programacin.

58

Programacin en Java para Ingenieros


Cuando una clase contiene una variable de algn tipo T como una variable miembro,
se dice que la clase tiene un objeto de tipo T. Cuando una clase se compone de
otros tipos de objetos, la programacin orientada a objetos utiliza el trmino de
composicin para denotar esto; es decir, la clase est compuesta de otros tipos de
objetos. Cuando una clase A hereda pblicamente desde una clase B, la
programacin orientada a objetos indica que se est modelando una relacin de
herencia; es decir, A es parte de B, pero no al contrario. Esencialmente, esto es lo que
la herencia pblica significa.
El polimorfismo permite dirigir hacia arriba tipos concretos a tipos ms generales, de
tal manera que un programa tiene la opcin de invocar los mtodos que corresponden
a los tipos dinmicos de los objetos. Las funciones abstractas o virtuales son un
tipo de polimorfismo.
Una clase abstracta o virtual es una clase que contiene funciones virtuales puras.
Una funcin virtual pura es una funcin virtual que es declarada en la clase base (la
clase abstracta) pero no es implementada en la misma. Esto es responsabilidad de las
clases derivada al sobrecargarse las funciones abstractas o virtuales y proporcionan
una implementacin para ellas.
Una interface es una coleccin de mtodos abstractos y propiedades. Todos los
mtodos que declara una interface son siempre pblicos o public. Las interfaces
tambin pueden contener datos definidos como public final static. Para usar una
interface, una clase debe especificar que va a implementar la interface utilizando la
palabra reservada implements y la clase debe definir cada mtodo con el nmero de
parmetros y el tipo de retorno especificaco en la definicin de la interface.

5.10. CASO DE ESTUDIO: JUEGO DE NAVES ESPACIALES


5.10.1.

PROBLEMA

Escribir un programa que permita simular en modo texto el movimiento de una flota de
naves espaciales dentro de un plano cartesiano de 200x150, para un juego en 2D,
donde la posicin de la nave espacial se genera aleatoriamente a travs de un punto
en 2D y luego se lo plasma en un Vector 2D que permite representar el movimiento de
una nave en el plano. La flota de naves espaciales estar compuesta por tres naves de
combate y dos naves bombarderas, cada una con su respectivo capitn, adems se
registrarn los datos con respecto a la posicin de la nave, la velocidad con la que
volar sobre un plano cartesiano, el nivel de combustible, el nivel de dao y
dependiendo del tipo de nave, el nmero de misiles y el nmero de bombas. Utilizar
para este caso de estudio composicin, herencia y polimorfismo.
A.) Consideraciones del problema:

Las naves espaciales partirn desde el origen de coordenadas, es decir, la


posicin (0,0).
Las naves espaciales podrn moverse dentro de un rango en x entre 10 y
190.
Las naves espaciales podrn moverse dentro de un rango en y entre 10 y
140.

59

Programacin en Java para Ingenieros

5.10.2.

Utilizar una clase abstracta para representar la entidad Nave Espacial y


crear clases derivadas para representar a las entidades Nave de Combate y
Nave Bombardera.
La nave de combate podr disparar un arma laser y disparar misiles dentro
de un rango entre 1 y 4.
La nave bombardera podr lanzar bombas dentro de un rango entre 1 y 6.
Las 5 naves debern realizar al menos tres movimientos de inspeccin y de
prueba de sus armas sobre el plano cartesiano.
Se debe crear una funcin para la leer los datos de una nave como los
mencionados en el problema.
Se debe crear una funcin para imprimir las estadsticas del vuelo de
inspeccin sobre el plano cartesiano.
ANLISIS

Claramente, se puede ver que las entradas del problema son los datos referentes a la
descripcin de la nave espacial, como son el nombre y apellido del capitn de la nave,
la posicin de la nave, la velocidad con la que volar sobre un plano cartesiano, el nivel
de combustible, el nivel de dao y dependiendo del tipo de nave, el nmero de misiles
y el nmero de bombas. Todos estos datos se organizarn en diferentes clases que
representarn a los diferentes entes que componen este juego para 2D.
5.10.3.

REQUERIMIENTOS DE LOS DATOS

A.) Constantes del Problema


Ninguna
B.) Entradas del Problema
Dato
mNombre
mApellido
mPosicion
mVelocidad
mNivelCombustible
mNivelDanio
mNumeroMisiles
mNumeroBombas

Descripcin
Nombre del capitn de la nave.
Apellido del capitn de la nave.
Vector 2D, que representa la posicin de una nave en el plano
cartesiano.
Vector 2D, que representa la velocidad de una nave en el plano
cartesiano. La velocidad se asumir que es uniformemente
constante y su valor no vara.
Representa al valor del nivel del combustible entre 0 y 100%.
Representa al valor del nivel de dao hecho a una nave y vara
entre 0 y 3.
Representa al nmero de misiles que puede llevar la nave de
combate.
Representa al nmero de bombas que puede cargar una nave
bombardera.

C.) Salidas del Problema


Dato
mPunto2DAleatorio
mX

Descripcin
Punto en 2D, que representa a la posicin aleatoria de la nave en
las coordenadas x e y.
Representa al valor de la coordenada de x de un Vector 2D y de

60

Programacin en Java para Ingenieros


un Punto 2D.
Representa al valor de la coordenada de y de un Vector 2D y de
un Punto 2D.

mY

D.) Frmulas Relevantes


Varias, como se indica en cada una de las clases implementadas.
5.10.4.

DISEO

Una vez que se conocen las entradas y salidas del problema, se debern disear las
clases que componen la aplicacin, para lo cual se presenta en la Figura 5.7, el
diagrama de clases utilizando composicin y herencia con notacin UML.

NaveEspacial
1
*
Punto2D

#mNombre : string
#mApellido : string
#mPosicion : Vector2D
#mVelocidad : Vector2D
#mNivelCombustible : int
#mNivelDanio : int
#mPunto2DAleatorio : Punto2D

-mX : float
-mY : float
-mPunto2D[] : int
-mNumeroAleatorio : NumeroAleatorio

1
*

*
Vector2D
-mX : float
-mY : float

NaveDeCombate

NaveBombardera

-mNumeroMisiles : int

-mNumeroBombas : int

NumeroAleatorio
-mLimiteInferior : int
-mLimiteSuperior : int
-mNumeroAleatorio : int

Figura 5.7. Diagrama de clases de la aplicacin.


En este diagrama se puede ver que la aplicacin est compuesta por una clase padre
que viene a ser una clase abstracta y la base para el resto de clases, la cual es la clase
NaveEspacial, la cual tiene dos clases hijas: NaveDeCombate y NaveBombardera. La clase
padre NaveEspacial, se compone de algunos tipos de datos entre los cuales estn un
objeto de tipo Vector2D y otro de tipo Punto2D, el cual se compone a su vez de otro
objeto de tipo NumeroAleatorio.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase se
omite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public abstract class NaveEspacial {}
public class NaveDeCombate extends NaveEspacial {}
public class NaveBombardera extends NaveEspacial {}

61

Programacin en Java para Ingenieros


public class Punto2D {}
public class Vector2D {}
public class NumeroAleatorio {}
5.10.5. IMPLEMENTACIN
La implementacin de todo este programa se lo realizar en un archivo de proyecto de
tipo Java Application (Aplicacin de Java) llamado JavaConsolaJuegoNavesEspaciales,
que contiene el paquete llamado PaqueteJuegoNavesEspaciales y que a su vez tiene
siete clases las mismas que son: NumeroAleatorio, Punto2D, Vector2D, NaveEspacial,
NaveDeCombate, NaveBombardera y Programa, que son las clases con las cuales se
resolvern el presente ejercicio, tal y como lo muestra la Figura 5.8.

Figura 5.4. Proyecto JavaConsolaJuegoNavesEspaciales.


Para resolver este ejercicio, primeramente se va crear una clase abstracta o virtual
llamada NaveEspacial de la cual se derivan las clases que son NaveDeCombate y
NaveBombardera. La clase base se compone de la clase Vector2D y Punto2D, la cual a su
vez se compone de la clase NumeroAleatorio.
La clase abstracta NaveEspacial contiene la implentacin de 23 mtodos pblicos, y
estas implementaciones son heredables, por lo que pueden ser usadas por las
subclases. Esta clase tambin proporciona un mtodo abstracto llamado
ImprimirEstadisticas, el cual ser implementado en cada subclase pero no en la
superclase. Adems esta clase posee 7 datos miembros definidos como protected, que
pueden ser accedidos por las clases derivadas.
La implementacin de la clase NaveEspacial, se presenta a continuacin en la tabla
5.5.1, que es parte de la solucin del caso de estudio.
Tabla 5.5.1: Cdigo de la clase NaveEspacial del programa.
/*
* Cdigo del archivo NaveEspacial.java
*/
package PaqueteJuegoNavesEspaciales;

62

Programacin en Java para Ingenieros


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public abstract class NaveEspacial
{
// Atributos de la clase.
protected String
mNombre;
protected String
mApellido;
protected Vector2D mPosicion;
protected Vector2D mVelocidad;
private int
mNivelCombustible;
protected int
mNivelDanio;
protected Punto2D mPunto2DAleatorio;
// Mtodos de la clase.
// Constructor sin parmetros.
public NaveEspacial()
{
setNombre("DefaultFirstName");
setApellido("DefaultLastName");
setPosicion(new Vector2D(0.0f, 0.0f));
setVelocidad(new Vector2D(1.0f, 1.0f));
setNivelCombustible(0);
setNivelDanio(0);
}
// Constructor con seis parmetros.
public NaveEspacial(String nombre,
String apellido,
Vector2D posicion,
Vector2D velocidad,
int combustible,
int danio)
{
setNombre(nombre);
setApellido(apellido);
setPosicion(posicion);
setVelocidad(velocidad);
setNivelCombustible(combustible);
setNivelDanio(danio);
}
// Funcin que obtiene el nombre de un usuario.
public String getNombre()
{ return mNombre; }
// Funcin que inicializa el nombre de un usuario.
public void setNombre(String nombre)
{ this.mNombre = nombre; }
// Funcin que obtiene el nombre de un usuario, como capitn de una nave.
public String getApellido()
{ return mApellido; }

63

Programacin en Java para Ingenieros


// Funcin que inicializa el nombre de un usuario, como capitn de una nave.
public void setApellido(String apellido)
{ this.mApellido = apellido; }
// Funcin que obtiene la posicin de una nave espacial en el plano.
public Vector2D getPosicion()
{ return mPosicion; }
// Funcin que inicializa la posicin de una nave espacial en el plano.
public void setPosicion(Vector2D posicion)
{ this.mPosicion = posicion; }
// Funcin que obtiene la velocidad de una nave espacial en el plano.
public Vector2D getVelocidad()
{ return mVelocidad; }
// Funcin que inicializa la velocidad de una nave espacial en el plano.
public void setVelocidad(Vector2D velocidad)
{ this.mVelocidad = velocidad; }
// Funcin que obtiene el nivel de combustible de una nave espacial.
public int getNivelCombustible() {
return mNivelCombustible;
}
// Funcin que inicializa el nivel de combustible de una nave espacial.
public void setNivelCombustible(int nivelCombustible) {
this.mNivelCombustible = nivelCombustible;
}
// Funcin que obtiene el nivel de dao de una nave espacial.
public int getNivelDanio()
{ return mNivelDanio; }
// Funcin que inicializa el nivel de dao de una nave espacial.
public void setNivelDanio(int nivelDanio)
{ this.mNivelDanio = nivelDanio; }
// Funcin que obtiene el valor de un nmero aleatorio generado.
public Punto2D getPunto2DAleatorio() {
return mPunto2DAleatorio;
}
// Funcin que inicializa el valor de un nmero aleatorio generado.
public void setPunto2DAleatorio(Punto2D punto2DAleatorio) {
this.mPunto2DAleatorio = punto2DAleatorio;
}
// Funcin que retorna una cadena de caracteres que concatena el nombre y
// el apellido del usuario, que va a ser el capitn de la nave espcial.
public String toString()
{
return getNombre() + " " + getApellido();
}

64

Programacin en Java para Ingenieros


// Funcin que retorna el tipo de nave espacial.
public String Tipo()
{
return "Indefinido";
}
// Funcin que indica que una nave espacial est volando.
public void Volar()
{
System.out.printf("Indefinido...\n");
}
// Funccin que indica que se est dibujando una nave espacial.
public void Dibujar()
{
System.out.printf("Indefinido...\n");
}
// Funcin que lee el nombre y el apellido del usuario, que va a ser el
// capitn de la nave.
public void LeerDatos()
{
String sData = "";
try
{
System.out.printf("Ingrese el nombre: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
mNombre = streamInput.readLine();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese el apellido: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
mApellido = streamInput.readLine();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
// Funcin que indica que se est disparando un misil.
public void DispararMisil()
{
System.out.printf("Sin definir...\n");
}

65

Programacin en Java para Ingenieros


// Funcin que indica que se est lanzando una bomba.
public void LanzarBomba()
{
System.out.printf("Sin definir...\n");
}
// Funcin abstracta utilizada para imprimir las estadsticas del juego.
public abstract void ImprimirEstadisticas();
}
La implementacin de la clase derivada NaveDeCombate, se presenta a continuacin en
la tabla 5.5.2, que es parte de la solucin del caso de estudio.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase NaveEspacial de la cual se deriva, realizan diferentes operaciones y donde se
necesite se puede invocar a las funciones de la clase padre utilizando la palabra
reservada super y adems se puede implementar todas las funciones de la clase
abstracta.
Tabla 5.5.2: Cdigo de la clase NaveDeCombate del programa.
/*
* Cdigo del archivo NaveDeCombate.java
*/
package PaqueteJuegoNavesEspaciales;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class NaveDeCombate extends NaveEspacial
{
// Atributos de la clase.
private int mNumeroMisiles;
// Mtodos de la clase.
// Constructor sin parmetros.
public NaveDeCombate()
{
super("Sin definir", "Sin definir",
new Vector2D(), new Vector2D(1, 1), 100, 0);
setNumeroMisiles(0);
}
// Constructor con siete parmetros.
public NaveDeCombate(String nombre, String apellido,
Vector2D posicion, Vector2D velocidad,
int combustible, int nivelDanio,
int numeroMisiles)
{

66

Programacin en Java para Ingenieros


super(nombre, apellido, posicion, velocidad, combustible, nivelDanio);
setNumeroMisiles(numeroMisiles);
}
// Funcin que obtiene el nmero de misiles de la nave de combate.
public int getNumeroMisiles()
{ return mNumeroMisiles; }
// Funcin que inicializa el nmero de misiles de la nave de combate.
public void setNumeroMisiles(int numeroMisiles)
{ this.mNumeroMisiles = numeroMisiles; }
// Funcin que indica que la nave de combte est disparando un arma lser.
public void DispararArmaLaser()
{
System.out.printf("Disparando arma laser.\n");
}
// Funcin que retorna el tipo de nave espacial.
@Override
public String Tipo()
{
return("Nave de ataque.\n");
}
// Funcin que indica que se est disparando un misil.
@Override
public void DispararMisil()
{
if(getNumeroMisiles() > 0)
{
System.out.printf("Disparando misil.\n");
setNumeroMisiles(getNumeroMisiles() - 1);
}
else
{
System.out.printf("No hay ningn misil disponible.\n");
}
}
// Funcin que retorna una cadena de caracteres que concatena el nombre y
// el apellido del usuario, que va a ser el capitn de la nave espcial.
@Override
public String toString()
{
return "Capitn de la nave: " + super.toString();
}
// Funcin que indica que una nave espacial est volando, para lo cual se
// simula el movimiento de una nave en el plano utilizando nmeros
// aleatorios que representa las coordenadas 'x' e 'y' de un punto en el
// plano.
@Override
public void Volar()
{

67

Programacin en Java para Ingenieros


int[] Punto2D = new int[2];
mPunto2DAleatorio = new Punto2D();
Punto2D = mPunto2DAleatorio.getPunto2DAleatorio();
setPosicion(new Vector2D(Punto2D[0], Punto2D[1]));
System.out.printf("Nave de combate volando por la posicin: "
+ "< %.2f, %.2f >\n",
getPosicion().getX(), getPosicion().getY());
}
// Funccin que indica que se est dibujando una nave espacial.
@Override
public void Dibujar()
{
System.out.printf("Dibujando a la nave de combate...\n");
}
// Funcin que lee el nombre y el apellido del usuario, que va a ser el
// capitn de la nave y el nmero de misiles que va a llevar la nave.
@Override
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el nmero de misiles (1-4): ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mNumeroMisiles = Integer.parseInt(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
// Funcin abstracta utilizada para imprimir las estadsticas del juego.
@Override
public void ImprimirEstadisticas()
{
System.out.printf("================================\n");
System.out.printf("El capitn de la naves es: %s\n", toString());
System.out.printf("Posicin: < %f, %f >\n",
getPosicion().getX(), getPosicion().getY());
System.out.printf("Velocidad: < %f, %f >\n",
getVelocidad().getX(), getVelocidad().getY());
System.out.printf("Nivel de combutible: %d\n", getNivelCombustible());
System.out.printf("Nivel de dao: %d\n", getNivelDanio());
System.out.printf("Nmero de misiles: %d\n", mNumeroMisiles);
}
}

68

Programacin en Java para Ingenieros


La implementacin de la clase derivada NaveBombardera, se presenta a continuacin en
la tabla 5.5.3, que es parte de la solucin del caso de estudio.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase NaveEspacial de la cual se deriva, realizan diferentes operaciones y donde se
necesite se puede invocar a las funciones de la clase padre utilizando la palabra
reservada super y adems se puede implementar todas las funciones de la clase
abstracta.
Tabla 5.5.3: Cdigo de la clase NaveBombardera del programa.
/*
* Cdigo del archivo NaveBombardera.java
*/
package PaqueteJuegoNavesEspaciales;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public final class NaveBombardera extends NaveEspacial
{
// Atributos de la clase.
private int mNumeroBombas;
// Mtodos de la clase.
// Constructor sin parmetros.
public NaveBombardera()
{
super("Sin definir", "Sin definir",
new Vector2D(), new Vector2D(1, 1), 100, 0);
setNumeroBombas(0);
}
// Constructor con siete parmetros.
public NaveBombardera(String nombre, String apellido,
Vector2D posicion, Vector2D velocidad,
int combustible, int nivelDanio,
int numBombas)
{
super(nombre, apellido, posicion, velocidad, combustible, nivelDanio);
setNumeroBombas(numBombas);
}
// Funcin que obtiene el nmero de bombas de la nave bombardera.
public int getNumeroBombas()
{ return mNumeroBombas; }
// Funcin que inicializa el nmero de bombas de la nave bombardera.
public void setNumeroBombas(int numeroBombas)
{ this.mNumeroBombas = numeroBombas; }

69

Programacin en Java para Ingenieros


// Funcin que retorna el tipo de nave espacial.
@Override
public String Tipo()
{
return("Nave bombardera.\n");
}
// Funcin que indica que se est lanzando una bomba.
@Override
public void LanzarBomba()
{
if(getNumeroBombas() > 0)
{
System.out.printf("Lanzando bomba.\n");
setNumeroBombas(getNumeroBombas() - 1);
}
else
{
System.out.printf("No hay ninguna bomba disponible.\n");
}
}
// Funcin que retorna una cadena de caracteres que concatena el nombre y
// el apellido del usuario, que va a ser el capitn de la nave espcial.
@Override
public String toString()
{
return "Capitn de la nave: " + super.toString();
}
// Funcin que indica que una nave espacial est volando, para lo cual se
// simula el movimiento de una nave en el plano utilizando nmeros
// aleatorios que representa las coordenadas 'x' e 'y' de un punto en el
// plano.
@Override
public void Volar()
{
int[] Punto2D = new int[2];
mPunto2DAleatorio = new Punto2D();
Punto2D = mPunto2DAleatorio.getPunto2DAleatorio();
setPosicion(new Vector2D(Punto2D[0], Punto2D[1]));
System.out.printf("Nave bombardera volando por la posicin: "
+ "< %.2f, %.2f >\n",
getPosicion().getX(), getPosicion().getY());
}
// Funccin que indica que se est dibujando una nave espacial.
@Override
public void Dibujar()
{
System.out.printf("Dibujando a la nave bombardera...\n");
}
// Funcin que lee el nombre y el apellido del usuario, que va a ser el
// capitn de la nave y el nmero de misiles que va a llevar la nave.

70

Programacin en Java para Ingenieros


@Override
public void LeerDatos()
{
String sData = "";
super.LeerDatos();
try
{
System.out.printf("Ingrese el nmero de bombas (1-6): ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
mNumeroBombas = Integer.parseInt(sData);
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
// Funcin abstracta utilizada para imprimir las estadsiticas del juego.
@Override
public void ImprimirEstadisticas()
{
System.out.printf("================================\n");
System.out.printf("El capitn de la naves es: %s\n", toString());
System.out.printf("Posicin: < %f, %f >\n",
getPosicion().getX(), getPosicion().getY());
System.out.printf("Velocidad: < %f, %f >\n",
getVelocidad().getX(), getVelocidad().getY());
System.out.printf("Nivel de combutible: %d\n", getNivelCombustible());
System.out.printf("Nivel de dao: %d\n", getNivelDanio());
System.out.printf("Nmero de bombas: %d\n", mNumeroBombas);
}
}
La implementacin de la clase NumeroAleatorio, se presenta a continuacin en la tabla
5.5.4, que es parte de la solucin del caso de estudio.
Esta clase posee un grupo de atributos y mtodos que permiten realizar diferentes
operaciones, como la funcin miembro getNumeroAleatorio, la cual permite obtener un
nmero aleatorio, dentro de un rango de nmeros.
Tabla 5.5.4: Cdigo de la clase NumeroAleatorio del programa.
/*
* Cdigo del archivo NumeroAleatorio.java
*/
package PaqueteJuegoNavesEspaciales;
import java.util.Random;

71

Programacin en Java para Ingenieros


public class NumeroAleatorio
{
// Atributos de la clase.
private int mLimiteInferior;
private int mLimiteSuperior;
private int mNumeroAleatorio;
// Mtodos de la clase.
// Constructor sin argumentos.
public NumeroAleatorio()
{
mLimiteInferior = 0;
mLimiteSuperior = 0;
mNumeroAleatorio = 0;
}
// Funcin
// nmeros
public int
return
}

que obtiene el lmite inferior de un rango de


aleatorios.
getLimiteInferior() {
mLimiteInferior;

// Funcin que inicializa el lmite inferior de un rango de


// nmeros aleatorios.
public void setLimiteInferior(int limiteInferior) {
this.mLimiteInferior = limiteInferior;
}
// Funcin
// nmeros
public int
return
}

que obtiene el lmite superior de un rango de


aleatorios.
getLimiteSuperior() {
mLimiteSuperior;

// Funcin que inicializa el lmite superior de un rango de


// nmeros aleatorios.
public void setLimiteSuperior(int limiteSuperior) {
this.mLimiteSuperior = limiteSuperior;
}
// Funcin que obtiene un nmero aleatorio.
public int getNumeroAleatorio() {
return mNumeroAleatorio;
}
// Funcin que inicializa un nmero aleatorio.
public void setNumeroAleatorio(int numeroAleatorio) {
this.mNumeroAleatorio = numeroAleatorio;
}
// Funcin que obtiene un nmero aleatorio, dentro de un rango de nmeros.
public int getNumeroAleatorio(int limiteInferior, int limiteSuperior)
{
Random numero = new Random();

72

Programacin en Java para Ingenieros


mLimiteInferior = limiteInferior; mLimiteSuperior = limiteSuperior;
if (mLimiteInferior > mLimiteSuperior)
{
throw new IllegalArgumentException("El inicio no puede "
+ "exceder del terminal.");
}
// Obtener el rango y convertir a long para evitar
// problemas de desbordamiento.
long range = (long)mLimiteSuperior - (long)mLimiteInferior + 1;
// Calcular el rango de una fraccin, 0 <= frac < range
long fraccion = (long)(range * numero.nextDouble());
mNumeroAleatorio = (int)(fraccion + mLimiteInferior);
return mNumeroAleatorio;
}
// Funcin que imprime un mensaje de control.
public void ImprimirMensaje(String aMessage)
{
System.out.println(aMessage);
}
}
La implementacin de la clase Punto2D, se presenta a continuacin en la tabla 5.5.5,
que es parte de la solucin del caso de estudio.
Esta clase posee un grupo de atributos y mtodos que permiten realizar diferentes
operaciones, como la funcin miembro getPunto2DAleatorio, la cual permite obtener
un arreglo de coordenadas 'x' e 'y', en funcin de un rango de valores, definidos por
dos lmites (inferior y superior).
Tabla 5.5.5: Cdigo de la clase Punto2D del programa.
/*
* Cdigo del archivo Punto2D.java
*/
package PaqueteJuegoNavesEspaciales;
public final class Punto2D
{
// Atributos de la clase.
int mX;
int mY;
private int[] mPunto2D;
private NumeroAleatorio mNumeroAleatorio;
// Mtodos de la clase.
// Constructor sin argumentos.
public Punto2D()
{
mX = 0;
mY = 0;
mNumeroAleatorio = new NumeroAleatorio();

73

Programacin en Java para Ingenieros


mPunto2D = new int[2];
}
// Funcin que obtiene la coordenada 'x' de un punto.
public int getX()
{
return mX;
}
// Funcin que inicializa la coordenada 'x' de un punto.
public void setX(int x)
{
this.mX = x;
}
// Funcin que obtiene la coordenada 'y' de un punto.
public int getY()
{
return mY;
}
// Funcin que inicializa la coordenada 'y' de un punto.
public void setY(int y)
{
this.mY = y;
}
// Funcin que obtiene un arreglo de coordenadas 'x' e 'y'.
public int[] getPunto2D() {
return mPunto2D;
}
// Funcin que obtiene un objeto de tipo NumeroAleatorio.
public NumeroAleatorio getNumeroAleatorio() {
return mNumeroAleatorio;
}
// Funcin que inicializa un objeto de tipo NumeroAleatorio.
public void setNumeroAleatorio(NumeroAleatorio numeroAleatorio) {
this.mNumeroAleatorio = numeroAleatorio;
}
// Funcin que inicializa un arreglo de coordenadas 'x' e 'y'.
public void setPunto2D(int[] punto2D) {
this.mPunto2D = punto2D;
}
// Funcin que obtiene un arreglo de coordenadas 'x' e 'y', en funcin de
// un rango de valores, definidos por dos lmites (inferior y superior).
public int[] getPunto2DAleatorio()
{
mPunto2D[0] = mNumeroAleatorio.getNumeroAleatorio(10, 190);
mPunto2D[1] = mNumeroAleatorio.getNumeroAleatorio(10, 140);
return mPunto2D;

74

Programacin en Java para Ingenieros


}
}
La implementacin de la clase Vector2D, se presenta a continuacin en la tabla 5.5.6,
que es parte de la solucin del caso de estudio.
Esta clase posee un grupo de atributos y mtodos que permiten realizar diferentes
operaciones, como la funcin miembro ImprimirDatos, la cual permite imprimir los
datos de vector en 2D, y la funcin miembro LeerDatos, la cual permite leer las
componentes 'x' e 'y' de un vector 2D, entre otras.
Tabla 5.5.6: Cdigo de la clase Vector2D del programa.
/*
* Cdigo del archivo Vector2D.java
*/
package PaqueteJuegoNavesEspaciales;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Vector2D
{
// Atributos de la clase.
private float mX, mY;
// Mtodos de la clase.
// Constructor sin parmetros.
public Vector2D()
{
setX(0.0f); setY(0.0f);
}
// Constructor con un parmetro, definido como un arreglo de tipo flotante.
public Vector2D(float[] coordenadas)
{
setX(coordenadas[0]); setY(coordenadas[1]);
}
// Constructor con dos parmetros de tipo entero.
public Vector2D(float x, float y)
{
setX(x); setY(y);
}
// Funcin que obtiene la coordenada 'x' de un vector en 2D.
public float getX()
{ return mX; }
// Funcin que inicializa la coordenada 'x' de un vector en 2D.
public void setX(float x)

75

Programacin en Java para Ingenieros


{ this.mX = x; }
// Funcin que obtiene la coordenada 'y' de un vector en 2D.
public float getY()
{ return mY; }
// Funcin que inicializa la coordenada 'y' de un vector en 2D.
public void setY(float y)
{ this.mY = y; }
// Funcin que compara los valores de las componentes de un vector en 2D.
public boolean Igualdad(Vector2D V)
{
return(getX() == V.getX() && getY() == V.getY());
}
// Funcin que suma los valores de las componentes de dos vectores en 2D.
public Vector2D Suma(Vector2D V)
{
Vector2D Temp = new Vector2D();
Temp.setX(getX() + V.getX());
Temp.setY(getY() + V.getY());
return Temp;
}
// Funcin que resta los valores de las componentes de dos vectores en 2D.
public Vector2D Resta(Vector2D V)
{
Vector2D Temp = new Vector2D();
Temp.setX(getX() - V.getX());
Temp.setY(getY() - V.getY());
return Temp;
}
// Funcin que obtiene el producto escalar de un vector en 2D.
public Vector2D ProductoEscalar(float escalar)
{
Vector2D P = new Vector2D();
P.setX(getX() * escalar);
P.setY(getY() * escalar);
return P;
}
// Funcin que obtiene la longitud de un vector en 2D.
public float Longitud()
{
return((float)Math.sqrt(getX() * getX() + getY() * getY()));
}
// Funcin que obtiene un vector en 2D normalizado, con sus componentes
// i, j y k.
public void Normalizar()

76

Programacin en Java para Ingenieros


{
float longitud = Longitud();
setX(getX() / longitud); setY(getY() / longitud);
}
// Funcin que obtiene el producto punto entre dos vectores en 2D.
public float ProductoPunto(Vector2D V)
{
float prodPunto = getX() * V.getX() + getY() * V.getY();
return prodPunto;
}
// Funcin que imprime los datos de vector en 2D.
public void ImprimirDatos()
{
System.out.printf("< %f, %f > \n", getX(), getY());
}
// Funcin que lee las componentes 'x' e 'y' de un vector 2D.
public void LeerDatos()
{
String sData = "";
try
{
System.out.printf("Ingrese x: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
setX(Float.parseFloat(sData));
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
try
{
System.out.printf("Ingrese y: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader streamInput = new BufferedReader(isr);
sData = streamInput.readLine();
setY(Float.parseFloat(sData));
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.5.7,
que es la parte final de la solucin del caso de estudio.

77

Programacin en Java para Ingenieros


a) Parte 1: Como se puede ver en la primera parte de la clase Programa, en la
seccin de atributos o datos miembro de clase, se declaran los objetos que
representan a las diferentes naves espaciales como son: ObjNaveDeCombate1,
ObjNaveDeCombate2,
ObjNaveDeCombate3,
ObjNaveBombardera1
y
ObjNaveBombardera2. Adems se declara un arreglo de objetos de tipo
NaveEspacial, llamado ArrayDeNavesEspaciales, donde se almacenarn luego
todos los objetos que representan a las naves espaciales.
b) Parte 2: En la segunda parte de la clase Programa, en la seccin del programa
principal principal void main simplemente se imprime un grupo de
mensajes para indicar que se va a trabajar con naves espaciales.
c) Parte 3: En la tercera parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica Inicializar, la
cual se encarga de crear e inicializar los objetos que representan a las naves
espaciales,
los
cuales
son:
ObjNaveDeCombate1,
ObjNaveDeCombate2,
ObjNaveDeCombate3, ObjNaveBombardera1 y ObjNaveBombardera2. Adems se crea
y se inicializa un arreglo de objetos de tipo NaveEspacial de tamao cinco,
llamado ArrayDeNavesEspaciales, donde en cada casillero del arreglo se
almacena una de las naves espaciales antes indicadas utilizando cada uno de
los objetos que representan a dichas naves.
d) Parte 4: En la cuarta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica LeerDatos, la
cual utiliza un bucle para obtener el tipo de nave espacial y leer los datos
correspondientes a cada figura nave espacial, utilizando el arreglo de objetos
de tipo NaveEspacial, llamado ArrayDeNavesEspaciales, invoca a dos mtodos:
a) Mtodo Tipo, que se encarga de obtener el tipo de la nave espacial a la cual
representa; b) Mtodo LeerDatos, que se encarga de leer los datos que le
corresponde de acuerdo a la nave espacial que representa. En este apartado se
utiliza el polimorfismo para asumir la forma de la nave espacial
correspondiente.
e) Parte 5: En la quinta parte de la clase Programa, en la seccin del programa
principal principal void main se llama a la funcin esttica ImprimirDatos,
tres veces, donde se realizan los clculos matemticos y la impresin de
resultados. Aqu el
arreglo de objetos de tipo NaveEspacial, llamado
ArrayDeNavesEspaciales, invoca a cinco mtodos: a) Mtodo Tipo, que se
encarga de obtener el tipo de nave espacial; b) Mtodo ImprimirEstadisticas,
que se encarga de realizar la impresin de los resultados obtenidos; c) Mtodo
Volar, que se encarga de obtener los valores de las coordenadas aleatorias de
un Punto en 2D que se asignan a un Vector en 2D; d) Mtodo DispararMisil,
que se encarga de realizar la impresin y los clculos del nmero de misiles
disparados; e) Mtodo LanzarBomba, que se encarga de realizar la impresin y
los clculos del nmero de bombas lanzadas. En este apartado tambin se
utiliza el polimorfismo para asumir la forma de la figura correspondiente.
Tabla 5.5.7: Cdigo de la clase Programa de la aplicacin.
/*
* Cdigo del archivo Programa.java
*/
package PaqueteJuegoNavesEspaciales;
public class Programa

78

Programacin en Java para Ingenieros


{
// Parte 1: Declaracin de objetos.
private static NaveEspacial ArrayDeNavesEspaciales[];
private static NaveDeCombate ObjNaveDeCombate1;
private static NaveDeCombate ObjNaveDeCombate2;
private static NaveDeCombate ObjNaveDeCombate3;
private static NaveBombardera ObjNaveBombardera1;
private static NaveBombardera ObjNaveBombardera2;
public static void main(String[] args)
{
// Parte 2: Impresin de mensajes de informacin.
System.out.printf("Naves Espaciales\n");
System.out.printf("================\n\n");
// Parte 3: Inicializacin de objetos.
// Llamada a la funcin Inicializar.
Inicializar();
// Parte 4: Lectura de datos.
// Llamada a la funcin LeerDatos.
LeerDatos();
System.out.printf("\n");
// Parte 5: Clculos e impresin de resultados.
// Llamada a la funcin ImprimirDatos.
ImprimirDatos();
ImprimirDatos();
ImprimirDatos();
}
// Funcin que permite crear e incializar objetos y un arreglo
// de objetos que contiene a todo el resto de objetos.
public static void Inicializar()
{
ObjNaveDeCombate1 = new NaveDeCombate();
ObjNaveDeCombate2 = new NaveDeCombate();
ObjNaveDeCombate3 = new NaveDeCombate();
ObjNaveBombardera1 = new NaveBombardera();
ObjNaveBombardera2 = new NaveBombardera();
ObjNavesEspaciales = new NaveEspacial[5];
ArrayDeNavesEspaciales[0]
ArrayDeNavesEspaciales[1]
ArrayDeNavesEspaciales[2]
ArrayDeNavesEspaciales[3]
ArrayDeNavesEspaciales[4]

=
=
=
=
=

ObjNaveDeCombate1;
ObjNaveDeCombate2;
ObjNaveDeCombate3;
ObjNaveBombardera1;
ObjNaveBombardera2;

}
// Funcin que permite leer los datos de los objetos a travs
// de un arreglo de objetos.
public static void LeerDatos()
{

79

Programacin en Java para Ingenieros


for(int i = 0; i < ArrayDeNavesEspaciales.length; i++)
{
System.out.printf(ArrayDeNavesEspaciales[i].Tipo());
ArrayDeNavesEspaciales[i].LeerDatos();
System.out.printf("\n");
}
}
// Funcin que permite imprimir los datos de los objetos a travs
// de un arreglo de objetos.
public static void ImprimirDatos()
{
for(int i = 0; i < ArrayDeNavesEspaciales.length; i++)
{
System.out.printf("\n");
System.out.printf(ObjNavesEspaciales[i].Tipo());
ArrayDeNavesEspaciales[i].ImprimirEstadisticas();
ArrayDeNavesEspaciales[i].Volar();
ArrayDeNavesEspaciales[i].DispararMisil();
ArrayDeNavesEspaciales[i].LanzarBomba();
ArrayDeNavesEspaciales[i].ImprimirEstadisticas();
System.out.printf("\n");
}
}
}
En las tablas 5.5.8, 5.5.9, 5.5.10 y 5.5.11 se muestra una de las salidas de este
programa en el cual justamente se ha utilizado un arreglo de objetos para instanciar o
crear los objetos que representan a las diferentes naves espaciales. Lo interesante de
este ejercicio es ver como trabaja una clase abstracta con datos miembro y funciones
miembros pblicas y abstractas, y ver como las clases derivadas implementan las
funciones de una clase abstracta. Adems se utiliz composicin para estructurar los
datos miembros de las diferentes clases creadas para la aplicacin.
Nota:

En este caso de estudio presentado, la herencia cumple la misma semntica,


ya que la clase NaveEspacial est compuesta de un objeto de la clase
Punto2D, y por dos objetos de tipo Vector2D.

80

Programacin en Java para Ingenieros


Tabla 5.5.8: Salida del programa.

Tabla 5.5.9: Salida del programa.

81

Programacin en Java para Ingenieros


Tabla 5.5.10: Salida del programa.

Tabla 5.5.11: Salida del programa.

82

Programacin en Java para Ingenieros


5.11. AUTOEVALUACIN
5.11.1. Suponga que usted quiere que algunos miembros de una clase sean
inaccesibles desde clases externas, excepto por clases que son derivadas
desde esta clase. Usted debera hacer que los datos miembro sean
a.
b.
c.
d.

public
protected
private
Ninguna de las anteriores

5.11.2.

Suponga que usted necesita inicializar gran cantidad de datos miembros en


una clase derivada con un constructor, sabiendo que parte de esos datos
pertenecen a una clase base. Por eficiencia del cdigo, usted debera

a. Saltar la inicializacin.
b. Utilizar una lista de inicializacin de datos miembros, precedidad por la palabra
clave super.
c. Inicializar los datos miembros directamente en el cuerpo de la funcin.
d. Inicializar los datos miembros en el cuerpo de la funcin, despus de la llamada
al constructor.
e. Ninguna de las anteriores
5.11.3. Cul es la jerarqua de clases en cdigo de la siguiente figura?
Avion

AvionDeCombate

AvionDeCaza

a.

public
public
public
public
public
public
public

AvionBombardero

AvionComercial

AvionDePasajeros

AvionDeCarga

abstract class Avion {}


class AvionDeCombate extends Avion {}
class AvionComercial extends Avion {}
class AvionDeCaza extends Avion {}
class AvionBombardero extends Avion {}
class AvionDePasajeros extends Avion {}
class AvionDeCarga extends Avion {}

83

Programacin en Java para Ingenieros


b.

public
public
public
public
public
public
public

abstract class Avion {}


class AvionDeCombate extends Avion {}
class AvionComercial extends Avion {}
class AvionDeCaza extends AvionDeCombate {}
class AvionBombardero extends AvionDeCombate {}
class AvionDePasajeros extends AvionComercial {}
class AvionDeCarga extends AvionComercial {}

c.

public
public
public
public
public
public
public

abstract class Avion {}


class AvionDeCombate {}
class AvionComercial {}
class AvionDeCaza extends AvionDeCombate {}
class AvionBombardero extends AvionDeCombate {}
class AvionDePasajeros extends AvionComercial {}
class AvionDeCarga extends AvionComercial {}

d.

public
public
public
public
public
public
public

abstract class Avion {}


class AvionDeCombate extends Avion {}
class AvionComercial extends Avion {}
class AvionDeCaza {}
class AvionBombardero {}
class AvionDePasajeros {}
class AvionDeCarga {}

e. Ninguna de las anteriores


5.11.4.

Se tiene un carro Ford que es un automvil Estadounidense, y este carro


tiene un motor Ford. Usted debera modelar estas relaciones en Java de la
siguiente manera:

a. Dibujando una figura con jerarqua de clases.


b. Creando la clase Ford que contiene un objeto de tipo Estadounidense, y de la
cual se deriva la clase MotorFord.
c. Creando una clase Ford derivada de la clase CarroEstadounidense, haciendo
que un objeto de la clase MotorFord sea un dato miembro de Ford.
d. Creando una clase MotorFord de la cual se deriva la clase CarroEstadounidense,
y de esta se deriva la clase CarroFord.
e. Ninguna de las anteriores
5.11.5.

Verdadero o falso. El polimorfismo es manejado por funciones abstractas o


virtuales.

a. Verdadero.
b. Falso.
5.11.6. Cul clase debera probablemente ser abstracta?
a.
b.
c.
d.
e.

F16.
F22.
F18.
AvionDeCaza.
Ninguna de las anteriores

84

Programacin en Java para Ingenieros


5.11.7.

Suponga que la clase E se deriva de la clase C y ambas E y C implementan


una funcin g con la misma firma. Verdadero o falso: Si una instancia de tipo
E invoca a la funcin g, luego la instancia de tipo C llama a la funcin g.

a. Verdadero.
b. Falso.

5.12. EJERCICIOS PROPUESTOS


5.12.1. Considerar el siguiente escenario donde se tiene un registro de estudiantes y
profesores de una escuela, y se quiere realizar lo siguiente:
a. Las personas que pueden ser registradas pueden ser alumnos y
profesores. Registrar a los alumnos y profesores de los diferentes
grados, para lo cual considerar que hay nueve grados y cada grado tiene
un solo profesor asignado a un mximo de veinte y cinco alumnos por
grado. (Aplicar Herencia).
b. Considerar los campos bsicos para el registro de alumnos y profesores
considerando las siguientes caractersticas: cdigo, edad, nombres,
apellidos,
cdula,
direccin,
telfono/s,
etc.
(Aplicar
Encapsulamiento).
c. Buscar a los estudiantes de acuerdo al nombre o al cdigo e imprimir el
grado y el profesor que tiene asignado. (Aplicar relaciones).
d. Buscar a los profesores de acuerdo al nombre o al cdigo e imprimir el
grado al cual ha sido asignado y los estudiantes que tiene a su cargo en
una tabla. (Aplicar relaciones).
e. Verificar que la coherencia de los datos es decir que los atributos de las
personas no puedan ser nulos e incoherentes en cualquier operacin
efectuada. (Aplicar Validaciones).
f. Disear un men para probar el ingreso, la eliminacin y la bsqueda de
datos.
5.12.2.

Considerar el siguiente escenario donde se tiene un almacn que vende


libros, revistas y discos, y se quiere realizar lo siguiente:
a. El almacn puede vender publicaciones de libros y revistas, adems de
discos. (Aplicar Herencia).
b. Registrar las publicaciones de libros y revistas con sus caractersticas
como: cdigo, nmero de pginas, ao de publicacin, precio, autor,
editorial, etc. Registrar los datos de los discos con sus caractersticas
como: cdigo, duracin en minutos, precio, grupo musical o solista, etc.
Adems registrar al cliente que compra la publicacin o el disco o las dos
cosas a la vez. (Aplicar Encapsulamiento).
c. Buscar a los clientes que han adquirido publicaciones y/o discos al ao e
imprimir sus datos. (Aplicar relaciones).
d. Buscar las publicaciones y discos ms vendidos al ao. (Aplicar
relaciones).
e. Verificar que la coherencia de los datos es decir que los atributos de las
publicaciones y/o discos no pueden ser nulos e incoherentes en cualquier
operacin efectuada. (Aplicar Validaciones).

85

Programacin en Java para Ingenieros


f.

5.12.3.

Disear un men para probar el ingreso, la eliminacin y la bsqueda de


datos.

Considerar el siguiente escenario donde se tiene un registro de pacientes,


empleados administrativos y mdicos de una clnica de especialidades mdicas
y se quiere realizar lo siguiente:
a. Las personas que pueden ser registradas pueden ser pacientes, empleados
administrativos, mdicos y proveedores. (Aplicar Herencia).
b. Registrar a los pacientes con sus respectivos mdicos tratantes en una
determinada especialidad, para lo cual considerar que hay nueve
especialidades (Medicina General, Traumatologa, Gastroenterologa,
Otorrinolaringologa, Cardiologa, Pediatra, Neurologa, Laboratorio Clnico,
Laboratorio Dental) y en cada especialidad hay un mdico tratante
asignado
a
un
determinado
nmero
de
pacientes.
(Aplicar
Encapsulamiento).
c. Considerar los campos bsicos para el registro de las personas como
empleados,
pacientes
y
mdicos
considerando
las
siguientes
caractersticas: cdigo, edad, nombres, apellidos, cdula, direccin y
telfono/s, salario, descuentos, costo de la atencin mdica, etc. (Aplicar
Encapsulamiento).
d. Buscar a los pacientes de acuerdo al nombre o el cdigo e imprimir la
especialidad y al mdico que tiene asignado. (Aplicar relaciones).
e. Buscar a los mdicos de acuerdo al nombre o el cdigo e imprimir la
especialidad y a los pacientes que tiene a su cargo en una tabla. (Aplicar
relaciones).
f. Buscar a los pacientes que son atendidos en una o varias especialidades a
la vez con su respectivo mdico e imprimir sus datos. (Aplicar
relaciones).
g. Verificar que la coherencia de los datos es decir que los atributos de las
personas no puedan ser nulos e incoherentes en cualquier operacin
efectuada. (Aplicar Validaciones).
h. Disear un men para probar el ingreso, la eliminacin y la bsqueda de
datos.

5.12.4.

Considerar el siguiente escenario donde se tiene un registro de pasajeros,


vuelos, aviones y pilotos de una aerolnea comercial y se quiere realizar lo
siguiente:
a. Las personas que pueden ser registradas son pasajeros y pilotos. (Aplicar
Herencia).
b. Registrar a los pasajeros con sus respectivos pilotos en un determinado
vuelo, para lo cual considerar que la aerolnea tiene una flota de cuatro
aviones con una capacidad para 120 personas cada uno. Cada avin realiza
dos vuelos diarios de lunes a viernes a diferentes destinos del pas.
(Aplicar Encapsulamiento).
c. Considerar los campos bsicos para el registro de las personas como
pasajeros y pilotos considerando las siguientes caractersticas: cdigo,
edad, nombres, apellidos, cdula, direccin y telfono/s, salario,
descuentos, costo del vuelo, etc. (Aplicar Encapsulamiento).

86

Programacin en Java para Ingenieros


d. Buscar a los pasajeros de acuerdo al nombre o el cdigo e imprimir el
cdigo o el nmero del vuelo en el cual estuvo con el piloto asignado a ese
vuelo. Considerar que un pasajero puede comprar boletos de ida y/o
regreso. (Aplicar relaciones).
e. Buscar a los pilotos de acuerdo al nombre o el cdigo e imprimir el cdigo
o el nmero del vuelo del que fue responsable. (Aplicar relaciones).
f. Verificar que la coherencia de los datos es decir que los atributos de las
personas no puedan ser nulos e incoherentes en cualquier operacin
efectuada. (Aplicar Validaciones).
g. Disear un men para probar el ingreso, la eliminacin y la bsqueda de
datos.
5.12.5.

Considerar el siguiente escenario donde se tiene un registro de rol de pagos


de los empleados de una industria de productos qumicos y se quiere realizar
lo siguiente:
a. Los empleados que pueden ser registrados pueden ser operadores, jefes
de seccin y directores de rea. (Aplicar Herencia).
b. Registrar a los empleados con sus respectivos cargos y sueldos, para lo
cual considerar que la industria remunera a sus empleados de acuerdo a
los siguientes costos: a) El Valor de la hora trabajada para un operador es
de $9.00; b) El Valor de la hora trabajada para un jefe de seccin es de
$14.00; b) El Valor de la hora trabajada para un director de rea es de
$20.00. (Aplicar Encapsulamiento).
c. Considerar los campos bsicos para el registro de las personas como
operadores, jefes de seccin y directores de rea considerando las
siguientes caractersticas: cdigo, edad, nombres, apellidos, cdula,
direccin y telfono/s, salario, descuentos, etc. Considerar que todo
trabajador aporta el 15% de su salario en bruto al IESS, el 8% al Impuesto
a la Renta. Todo trabajador es parte de un sindicato que le descuenta el
2% del salario para financiar eventos de capacitacin y de entretenimiento,
adems se aporta a un seguro de salud y de vida que es el equivalente al
10% del salario en bruto. Considerar tambin la posibilidad de descontar
un valor por prstamos hipotecarios y quirografarios. Los empleados
adems pueden ganar horas extras trabajando los sbados, para lo cual se
considera un valor del 50% adicional del valor de la hora normal de
trabajo. (Aplicar Encapsulamiento).
d. Buscar a los empleados de acuerdo al nombre o el cdigo e imprimir el
cdigo o el nmero del jefe superior con el cual trabaja o est asignado.
(Aplicar relaciones).
e. Buscar a los jefes superiores de acuerdo al nombre o el cdigo e imprimir
el cdigo o el nmero de los empleados que tiene bajo su responsabilidad.
(Aplicar relaciones).
f. Verificar que la coherencia de los datos es decir que los atributos de las
personas no puedan ser nulos e incoherentes en cualquier operacin
efectuada. (Aplicar Validaciones).
g. Disear un men para probar el ingreso, la eliminacin y la bsqueda de
datos.

87

Programacin en Java para Ingenieros


BIBLIOGRAFA

88

You might also like