PROGRAMACIÓN ORIENTADA A OBJETOS Unidad 1 GENERICIDAD M.S.C. Ivette Hernández Dávila.

Post on 24-Jan-2016

228 views 0 download

Transcript of PROGRAMACIÓN ORIENTADA A OBJETOS Unidad 1 GENERICIDAD M.S.C. Ivette Hernández Dávila.

PROGRAMACIÓN ORIENTADA A OBJETOS

Unidad 1 GENERICIDAD

M.S.C. Ivette Hernández Dávila

Clases fundamentales• Todas las clases de Java poseen una superclase común,

esa es la clase Object. Por eso los métodos de la clase Object son fundamentales ya que todas las clases los heredan.

• Esos métodos están pensados para todas las clases, pero hay que redefinirlos para que funcionen adecuadamente.

• Es decir, Object proporciona métodos que son heredados por todas las clase. La idea es que todas las clases utilicen el mismo nombre y prototipo de método para hacer operaciones comunes como comprobar igualdad, clonar, .... y para ello habrá que redefinir esos métodos a fin de que se ajusten adecuadamente a cada clase.

Comparar objetos• La clase Object proporciona un método para

comprobar si dos objetos son iguales. Este método es equals. Este método recibe como parámetro un objeto con quien comparar y devuelve true si los dos objetos son iguales.

• No es lo mismo equals que usar la comparación de igualdad. Ejemplos:

• El operador “==” devuelve true si los dos objetos se refieren a la misma cosa (las dos referencias apuntan al mismo objeto).

• Realmente en el ejemplo anterior la respuesta del método equals sólo será válida si en la clase que se está comparando (Coche en el ejemplo) se ha redefinido el método equals. Esto no es opcional sino obligatorio si se quiere usar este método. El resultado de equals depende de cuándo consideremos nosotros que devolver verdadero o falso.

• La clase Object define una serie de métodos que pueden utilizarse sobre todos los objetos que se creen en Java. Estos métodos son: clone(), equals(), finalize(), getClass(), hashCode(), toString(), wait(), notify() y notifyAll().

• El método toString() devuelve una cadena asociada al objeto. De esta forma todos los objetos en Java tienen una representación en forma de cadena de texto.

• El método hashCode() devuelve un entero que puede utilizarse como identificador único del objeto en la máquina virtual.

La madre de todas las clases: Object

• En Java todas las clases descienden de la clase Object.

• Es como si el compilador añadiera “extends Object” a todas las clases que no extienden explícitamente a ninguna otra.

Introducción: Genericidad• La programación orientada a objetos tiene como principales

objetivos favorecer la confiabilidad, reusabilidad y extensibilidad del software.

• Adoptar el enfoque propuesto por la programación orientada a objetos implica:

En la etapa de diseño reducir la complejidad en base a la descomposición del problema en piezas más simples a partir de la identificación de objetos y su organización en una estructura de clases.

En la etapa de implementación utilizar un lenguaje que permita retener la estructura de clases identificada en la etapa de diseño y encapsular la representación interna de modo que sea inaccesible desde el exterior.

Genericidad• El encapsulamiento permite usar una clase considerando qué

funcionalidad brinda, sin tener en cuenta cómo la implementa.

• La herencia permite aumentar el nivel de abstracción mediante un proceso de clasificación en niveles.

• El proceso consiste en abstraer lo que es común y esencial en un conjunto de entidades para formar un concepto general que comprenda a todas.

• Una clase derivada puede pensarse como una especialización de una clase más general.

• Alternativamente podemos pensar a una clase derivada como una extensión de la clase base.

Genericidad• La extensibilidad se refiere a reducir el impacto de los cambios.

• Las modificaciones con frecuencia pueden resolverse definiendo nuevas clases específicas, sin necesidad de cambiar las que ya han sido verificadas.

• La reusabilidad evita escribir el mismo código repetidamente. Para lograrlo es necesario distinguir el comportamiento general del particular.

• La genericidad favorece la reusabilidad.

• Una clase genérica encapsula a una estructura cuyo comportamiento es independiente del tipo de las componentes.

Genericidad• La genericidad puede modelarse en Java de dos

maneras diferentes: usando tipos de datos parametrizados o usando herencia.

Clases parametrizadas• Para dar soporte a la genericidad, en la versión

1.5 Java introduce el concepto de genérico. Los genéricos permiten definir parámetros que se corresponden con un tipo en la definición de una clase o una interfaz. Estos genéricos dan lugar al concepto de clase (o interfaz) genérica. Las clases (o interfaces) genéricas también suelen denominarse clases parametrizadas.

• La principal utilidad de las clases parametrizadas es la de permitir la creación de contenedores genéricos que acepten elementos independientes de su tipo. Hasta la versión 1.4 de Java, la genericidad se conseguía construyendo contenedores que almacenaban objetos de la clase Object y el casting posterior a la clase correspondiente.

Jerarquía de herencia entre clases parametrizadas

Ejemplo de uso genérico• El siguiente ejemplo muestra cómo utilizar los

genéricos al crear una clase Concesionario genérica, que luego será capaz de generar objetos Concesionario de objetos Deportivo y objetos Concesionario de objetos Utilitario.

• Al crear una clase parametrizada se crea una superclase de la que heredarán cada una de las clases con una parametrización específica. A esta clase se la puede referenciar utilizando el símbolo de interrogación como parámetro. Así, la clase VectorDinamico<?> es superclase de todas las clases VectorDinamico, y puede utilizarse para aquellos casos en los que deseemos realizar alguna operación sobre un VectorDinamico sin importarnos el tipo de objeto que almacena.

Métodos genéricos• Al igual que se definen clases genéricas, es posible definir

métodos genéricos (incluso en clases no genéricas).• Es posible definir tipos genéricos en el interior de las

clases y utilizarlos para definir los parámetros de los métodos y los valores devueltos por estos. Al definir el método, las llaves angulares aparecen después de los modificadores del método y antes del tipo devuelto.

Genericidad con más de una variable

• Una clase genérica (o un método) puede referencias más de una variable genérica.

• Ejemplo:• La interfaz Map<K,V> del API de Java• public interface Map<K, V>{ … }• Permite establecer una correspondencia entre objetos de un

tipo (denominados claves) y de otro (denominados valores)• Ambos tipos pueden coincidir.• Ejemplo de instanciación:• Map<Integer, String> m = new SortedMap<Integer,

String>();• m.put(new Integer(5), “casa”);• String s = m.get(new Integer(5));

Bibliografía• Tutorial “Learning the Java Lenguage. Generics”

disponible en Inglés en la siguiente dirección: http://java.sun.com/docs/books/tutorial/java/generics/

Colecciones de Objetos• Una colección de objetos es sencillamente un

conjunto de cosas del mismo tipo.• En Java, existen colecciones de objetos que

también son considerados otros objetos, están modelados por clases o por estructuras primitivas. ArrayList es una clase que modela a un grupo especial de colecciones.

ArrayList• La clase ArrayList almacena un conjunto de

objetos del mismo tipo a manera de lista. Java tiene una suite completa de objetos “Collection” que almacenan objetos de varias maneras. ArrayList es el tipo de colección más famoso y comúnmente usado.

Métodos

Ejemplo de operaciones más utilizadas•Declaración de un ArrayList de

enteros

•Creación de un ArrayList de enteros

• Añadiendo elementos al ArrayList

• Conociendo el tamaño del ArrayList

• Obteniendo un elemento del ArrayList

• Borrando un elemento del ArrayList

• Existen otras clases que modelan colecciones de objetos como HashMap, HashSet, Vector, etc. todas ellas propias de Java. También existen estructuras primitivas para manejar conjuntos de elementos conocidas como arreglos.