• No se han encontrado resultados

TIPOS ABSTRACTOS DE DATOS EN JAVA

In document Tipos de datos: Clases y objetos (página 30-34)

La implementación de un TAD en Java se realiza de forma natural con una clase. Dentro de la clase va a residir la representación de los datos junto a las operaciones (métodos de la clase). La interfaz del tipo abstracto queda perfectamente determinada con la etiqueta public, que se aplicará a los métodos de la clase que representen operaciones.

Por ejemplo, si se ha especificado el TAD Punto para representar la abstracción punto en el espacio tridimensional, la siguiente clase implementa el tipo:

class Punto {

// representación de los datos private double x, y, z;

// operaciones

public double distancia(Punto p); public double modulo();

public double anguloZeta(); ...

};

2.12.1. Implementación del TAD Conjunto

La implementación de un TAD se realiza según la especificación realizada del tipo. La clase Conjunto implementa el TAD Conjunto, cuya especificación se encuentra en el apartado 2.3. La clase representa los datos de forma genérica, utiliza un array para almacenar los elementos, de tipo Object.

Archivo conjunto.java

package conjunto; public class Conjunto {

static int M = 20; // aumento de la capacidad private Object [] cto;

private int cardinal; private int capacidad; // operaciones

public Conjunto() {

cto = new Object[M]; cardinal = 0;

capacidad = M; }

// determina si el conjunto está vacío public boolean esVacio()

{

return (cardinal == 0); }

// añade un elemento si no está en el conjunto public void annadir(Object elemento)

{

if (!pertenece(elemento)) {

/* verifica si hay posiciones libres, en caso contrario amplia el conjunto */ if (cardinal == capacidad)

{

Object [] nuevoCto;

nuevoCto = new Object[capacidad + M]; for (int k = 0; k < capacidad; k++) nuevoCto[k] = cto[k];

capacidad += M; cto = nuevoCto;

}

cto[cardinal++] = elemento; }

}

// quita elemento del conjunto public void retirar(Object elemento) { if (pertenece(elemento)) { int k = 0; while (!cto[k].equals(elemento)) k++;

/* desde el elemento k hasta la última posición mueve los elementos una posición a la izquierda */ for (; k < cardinal ; k++)

cto[k] = cto[k+1]; cardinal--;

} }

//busca si un elemento pertenece al conjunto public boolean pertenece(Object elemento) {

int k = 0;

boolean encontrado = false;

while (k < cardinal && !encontrado) { encontrado = cto[k].equals(elemento); k++; } return encontrado; }

//devuelve el número de elementos public int cardinal()

{

return this.cardinal; }

//operación unión de dos conjuntos public Conjunto union(Conjunto c2) {

Conjunto u = new Conjunto();

// primero copia el primer operando de la unión for (int k = 0; k < cardinal; k++)

u.cto[k] = cto[k]; u.cardinal = cardinal;

// añade los elementos de c2 no incluidos for (int k = 0; k < c2.cardinal; k++)

u.annadir(c2.cto[k]); return u;

}

public Object elemento(int n) throws Exception {

if (n <= cardinal) return cto[--n]; else

throw new Exception("Fuera de rango"); }

RESUMEN

Los tipos abstractos de datos (TAD) describen un conjunto de objetos con la misma represen- tación y comportamiento. Los tipos abstractos de datos presentan una separación clara entre la interfaz externa de un tipo de datos y su implementación interna. La implementación de un tipo abstracto de datos está oculta. Por consiguiente, se pueden utilizar implementaciones alternativas para el mismo tipo abstracto de dato sin cambiar su interfaz.

La especificación de un tipo abstracto de datos se puede hacer de manera informal, o bien, de forma mas rigurosa, una especificación formal. En la especificación informal se describen literalmente los datos y la funcionalidad de las operaciones. La especificación formal describe los datos, la sintaxis y la semántica de las operaciones, considerando ciertas operaciones como axiomas, que son los constructores de nuevos datos. Una buena especificación formal de un tipo abstracto de datos debe poder verificar la bondad de la implementación.

En la mayoría de los lenguajes de programación orientados a objetos, y en particular en Java, los tipos abstractos de datos se implementan mediante clases.

Una clase es un tipo de dato definido por el programador que sirve para representar objetos del mundo real. Un objeto de una clase tiene dos componentes: un conjunto de atributos o variables instancia y un conjunto de comportamientos (métodos). Los atributos también se llaman variables instancia o miembros dato, y los comportamientos se llaman métodos miembro.

class Circulo {

private double centroX; private double centroY; private double radio; public double superficie(){} }

Un objeto es una instancia de una clase, y una variable cuyo tipo sea la clase es una referencia a un objeto de la clase.

Circulo unCirculo; // variable del tipo clase

Circulo [] tipocirculo = new Circulo[10]; // array de referencias La definición de una clase, en cuanto a visibilidad de sus miembros, tiene tres secciones:

pública, privada y protegida. La sección pública contiene declaraciones de los atributos y

del comportamiento del objeto que son accesibles a los usuarios del objeto. Se recomienda la declaración de los constructores en la sección pública. La sección privada contiene los mé- todos miembro y los miembros dato, que son ocultos o inaccesibles a los usuarios del objeto. Estos métodos miembro y atributos dato son accesibles sólo por los métodos miembro del objeto. Los miembros de una clase con visibilidad protected son accesibles para cualquier usuario de la clase que se encuentre en el mismo package; también son accesibles para las clases derivadas. El acceso por defecto, sin modificador, tiene las mismas propiedades que el acceso protected para las clases que se encuentran en el mismo package.

Un constructor es un método miembro con el mismo nombre que su clase. Un constructor no puede devolver un tipo pero puede ser sobrecargado.

class complejo {

public complejo(double x, double y){} public complejo(complejo z){}

}

El constructor es un método especial que se invoca cuando se crea un objeto. Se utiliza, normalmente, para inicializar los atributos de un objeto. Por lo general, al menos se define un constructor sin argumentos, llamado constructor por defecto. En caso de no definirse el constructor, implícitamente queda definido un constructor sin argumentos que inicializa cada miembro numérico a 0, los miembros de tipo boolean a true y las referencias a null. El proceso de crear un objeto se llama instanciación (creación de instancia). En Java se crea un objeto con el operador new y un constructor de la clase.

Circulo C = new Circulo();

En Java, la liberación de objetos es automática; cuando un objeto deja de estar referenciado por una variable es candidato a que la memoria que ocupa sea liberada y, posteriormente, reutiliza- da. El proceso se denomina garbage collection, el método System.gc() realiza el proceso. Los paquetes son agrupaciones de clases relativas a un tema. El sistema suministra paquetes con clases que facilitan la programación. Se puede afirmar que el paquete java.lang es donde se en- cuentran las clases mas utilizadas, por lo que es automáticamente incorporado a los programas. Los miembros de una clase definidos como static no están ligados a los objetos de la clase sino que son comunes a todos los objetos, son de la clase. Se cualifican con el nombre de la clase, por ejemplo:

Math.sqrt(x);

EJERCICIOS

In document Tipos de datos: Clases y objetos (página 30-34)

Documento similar