Una clase que modela los atributos y el comportamiento de una colección de objetos, define un tipo de dato. Si en el modelo se encapsula la representación de los atributos y la implementación de las operaciones, el tipo de dato es abstracto. La interface describe qué pueden hacer los objetos de una clase, la implementación establece cómo lo hacen.
Al definir un tipo de dato abstracto, se extienden las facilidades provistas por el lenguaje con una nueva abstracción. Algunos tipos son generales y más fáciles de reusar. Otros son más específicos de una aplicación en particular. El TDA String provisto por Java es muy general y seguramente podrá usarse en aplicaciones muy diversas, nuestro TDA Racional es más específico y el TDA Ciudad todavía más.
Ejemplo: Implementar un TDA Vector que brinde operaciones para calcular el producto escalar de un vector, el producto vectorial entre dos vectores, la suma de dos vectores, etc. El vector se representa mediante un arreglo de números reales. La clase que encapsula al arreglo brinda operaciones para establecer y obtener un elemento y para comparar, copiar y clonar vectores.
Vector real [] vec <<constructores>> Vector (max : entero) <<comandos>> establecerelem (pos : entero, elem : real) copy (v: Vector) Asume que la Posición es válida El comentario asociado al método establecerelem establece una precondición, un compromiso para la clase cliente.
Vector real [] vec <<consultas>> existepos (p : entero): boolean existeelem (r : real) : boolean obtenerelem (p : entero) : real cantelems () : entero prodescalar(v : Vector) : real suma (v : Vector ) : Vector escalarxvector(e : entero) : Vector equals (v : Vector) : boolean clone () : Vector Asume que la posición es válida Asume que las longitudes son consistentes
public class Vector { private float[] vec; // Constructor public Vector(int m) { vec = new float[m]; // Comandos public void establecerelem(int p,float val) { //Asume que la posición es válida vec[p] = val; vec es una variable que referencia a un arreglo, Vector es una clase a partir de la cual se crearán objetos
// Consultas public boolean existepos (int p) { return (p >= 0 && p < vec.length); public float obtenerelem (int p){ //Asume que la posición es válida return vec[p]; public int cantelems () { return vec.length;
// Consultas public float prodescalar(vector v) { //Asume que las longitudes son consistentes float pe=0; for (int i=0;i<vec.length;i++) pe= pe+v.obtenerelem(i)*vec[i]; return pe;
// Consultas public Vector suma (Vector v){ //Asume que las longitudes son consistentes Vector aux=new Vector(vec.length); float r ; for (int i=0;i<vec.length;i++) { r=vec[i]+ v.obtenerelem(i)) ; aux.establecerelem(i,r); return aux;
// Consultas public Vector escalarxvector(float esc) { Vector aux = new Vector(vec.length); for (int i=0;i<vec.length;i++) aux.establecerelem(i,vec[i]*esc); return aux;
La entrada y salida se realiza desde la clase cliente. La estructura está completa y la cantidad de elementos se define en el momento de la creación. Todos los elementos ya están ingresados cuando empieza el procesamiento Introducción a la Programación
public class TestVector { public static void main (String arg[]) { Vector v1,v2,v3; v1 = generavector(m); mostrarvector(v1); v2 = generavector(m); mostrarvector(v2); if (v1.cantelems() == v2.cantelems()) { System.out.println("Producto escalar "+ v1.prodescalar(v2)); else...;
if (v1.cantelems() == v2.cantelems()) { System.out.println("Vector suma "); v3 = v1.suma(v2); mostrarvector(v3); else... v2 = v2.escalarxvector (5); System.out.println("Vector v2 X escalar "); mostrarvector(v2);
Administración de Memoria public class Vector { private float[] vec; // Constructor public Vector(int m) { vec=new float[m]; Vector v1; v1=new Vector(5); Se declara una variable v1 y se crea un objeto de la clase Vector cuya referencia se almacena en v1. v1 vec length 5
Aclaración Java brinda en el paquete java.util una clase llamada Vector con características muy diferentes a la que hemos definido. Si quisiéramos implementar la clase especificada por el diagrama y también usar la clase Vector provista por el paquete java.util, deberíamos utilizar un nombre diferente.