La herencia
Objetivos del capítulo
Los objetivos de este capítulo son:
-
Diseñar aplicaciones usando el diagrama de clases UML.
-
Desarrollar aplicaciones usando la herencia, las clases abstractas y las interfaces.
Estas nociones están presentes a partir de ejemplos.
Herencia, polimorfismo
1. Clase Circulo
a. Propiedades y métodos de la clase Circulo
Un círculo se define por su centro y su radio:
public class Circulo
{
private Punto centro;
private int radio;
public Circulo(Punto centro, int radio)
{
this.centro = centro;
this.radio = radio;
}
Un objeto de la clase java.awt.Punto representa las coordenadas (x,y) de un punto. Los valores x e y permiten localizar un punto respecto al origen (0, 0). Este origen designa la esquina superior izquierda del espacio en el que el punto se localiza.
La clase Circulo tiene:
-
las propiedades centro y radio,
-
métodos que simulan el desplazamiento gráfico de un círculo. El desplazamiento de un círculo consiste en eliminarlo, moverlo y, para terminar, mostrarlo en una nueva posición. Los tres métodos son:
-
eliminar()
-
mover()
-
visualizar()
A falta de abordar la programación gráfica, los métodos eliminar() y visualizar() se limitan a una impresión en la consola.
public void visualizar()
{
System.out.println("Visualización del círculo : " + this);
}
public void eliminar()
{
System.out.println("Borrado del círculo: " + this);
}
public void mover(Punto nuevoCentro)
{
eliminar();
centro = nuevoCentro;
visualizar();
}
-
Un método toString() es práctico para la visualización:
public String toString()
{
return centro.x + ", " + centro.y + ", radio " + radio;
}
}
b. Programa de comprobación
El programa de comprobación es el siguiente:
import java.awt.Punto;
public...
Trabajo práctico: Animal
1. Objetivo
El objetivo es manipular los conceptos de herencia y polimorfismo.
2. Tema
Crear una clase Animal.
Propiedades
-
un booleano vivo (verdadero si el animal está vivo, falso en caso contrario);
-
un entero edad (edad del animal);
-
un entero numeroAnimalesVivos (número de animales vivos);
-
un entero edadMaxima (edad máxima de un animal).
Métodos
-
Constructor de inicialización (Animal(int edad)).
-
envejecer(): hace envejecer al animal un año.
-
morir(): mata al animal.
-
gritar(): hace gritar al animal (el animal gritará: «Soy un animal.»).
Crear una clase Vaca que herede de Animal.
-
Una vaca grita «Muuuuuuu!»
-
También tiene una propiedad edadMaxima (edad máxima de una vaca).
Para realizar sus comprobaciones, utilice el programa que sigue (para hacer que los animales vivan, hacerlos gritar y envejecer):
public class VerificarAnimal
{
public static void main(String argv[])
{
Animal tablasAnimal[] = new Animal[2];
int iAnimal;
tablasAnimal[0] = new Vaca(1);
tablasAnimal[1] = new Animal(2);
while (Animal.getNumeroAnimalesVivos() > 0)
{
for (iAnimal = 0; iAnimal < 2; iAnimal++)
{
if (tableAnimal[iAnimal].getVivo())
{
tablasAnimal[iAnimal].gritar();
tablasAnimal[iAnimal].envejecer(); ...
Clases abstractas
1. Definición
Una clase abstracta no se puede instanciar.
Ejemplo
public class TestAbstract
{
public static void main(String argv[])
{
A a;
a = new A();
}
}
public abstracta class A
{
}
Si es imposible instanciar una clase abstracta, solo se puede utilizar por medio de clases heredadas.
De esta manera, en el TP Animal nos sentimos cómodos con que una instancia de la clase Animal sea artificial. ¿Qué grito le hace crecer? Definir la clase Animal de manera abstracta tiene la ventaja de impedir estas instanciaciones artificiales. Pero hay otras ventajas... Veámoslas en nuestro ejemplo.
2. Ejemplo del TP Animal
a. Eliminación de la propiedad edadMaxima de la clase Animal
En el TP Animal, algunas propiedades y métodos de la clase Animal son artificiales.
Ejemplos
-
edadMaxima: fijar una edadMaxima para todos los animales no es lógico. Es más juicioso definirla para cada clase heredada de Animal.
-
gritar(): el método gritar() apenas tiene sentido en la clase Animal.
En la clase Animal, eliminamos la propiedad edadMaxima:
Inmediatamente, se produce un error de compilación en el método getEdadMaxima():
Eliminamos el método getEdadMaxima():
Inmediatamente, se produce un error de compilación...
Interfaces
1. Presentación
Una interfaz es una clase abstracta donde todos sus métodos son abstractos.
Una interfaz también puede tener propiedades de clase constantes (static final), pero es más raro. Desde Java SE 8, incluso puede proponer el código por defecto para los métodos.
2. Ejemplo de interfaces
public interfaz Formidable
{
public void metodoFormidable();
}
public interfaz Admirable
{
public void metodoAdmirable1();
public void metodoAdmirable2();
}
No es necesario poner la palabra clave abstract a los métodos de una interfaz.
3. Implementación de interfaces
Una clase puede heredar de una interfaz, como también puede heredar de cualquier otra clase. Para esto utiliza la palabra clave implements. Se dice que la clase implementa una interfaz.
La clase que implementa una interfaz debe redefinir todos los métodos de la interfaz. Por defecto, es una clase abstracta.
Ejemplo
public class ClaseHija implements Formidable, Admirable
{
public void metodoFormidable()
{
System.out.println("metodoFormidable()");
}
public void metodoAdmirable1()
{ ...
Trabajo práctico: superficies comparables
1. Objetivo
Se trata de diseñar y desarrollar una aplicación utilizando clases abstractas y e interfaces.
2. Tema
Retome la aplicación VerificaComparableTabla de la sección anterior, que permite ordenar las tablas que contienen referencias de objetos de tipo Comparable (que implementan la interfaz Comparable).
Escriba el código necesario para ordenar los objetos que representan las figuras geométricas (círculos, rectángulos y triángulos) por orden de superficie creciente, usando sin modificar la clase OrdenacionBurbujaTabla.
Ejemplo de resultado deseado:
La clase principal de la aplicación es la siguiente:
import herramientasMG.varios.OrdenacionBurbujaTabla;
public class VerificaSuperficieComparable
{
public static void main(String argv[])
{
Figura tabFiguras[] =
{
new Triangulo(6, 2),
new Circulo(4),
new Rectangulo(7, 9),
new Triangulo(6, 17),
new Circulo(3),
new Triangulo(6...
La visibilidad
Todas las clases de este libro se declaran como public. Es una buena práctica. Una clase pública se puede utilizar en cualquier otra clase. Cuando se omite la palabra clave public en la declaración de una clase, solo es utilizable (visible) por las clases del mismo paquete.
El programa origen de una clase pública Xxx debe estar en un archivo llamado Xxx.java. Por lo tanto, solo puede tener una clase pública por archivo origen. Es una obligación que facilita la organización de los archivos y clases.
Todas las propiedades de este libro se declaran como private. Casi todos los métodos se declaran public. Es una elección de programación. Es posible declarar cualquier miembro de una clase (propiedad, método, clase interna) como public y private.
Un miembro private solo es utilizable en la clase que le declara.
Un miembro public es utilizable en cualquier clase.
La palabra clave protected permite utilizar un miembro en la clase que le declara, en las clases heredadas y en las clases del mismo paquete.
En ausencia de la palabra clave (normalmente un olvido), declara un miembro de paquete, visible en todas las clases del mismo paquete.
1. Visibilidad de las clases
Las clases internas (declaradas dentro de otra clase) pueden ser private o protected. Su visibilidad es la misma que la de los otros miembros (propiedades, métodos). Ver la tabla de visibilidad de los miembros siguiente....