Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López

Download Report

Transcript Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López

Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos

Pedro García López [email protected]/

Estudio de caso: Java Lenguaje:

Programa Java • Simple Java APIs • Orientado a Objetos Java Virtual Machine • Robusto Computadora • Arquitectura-neutral (portable) • Moderno • Tipado estáticamente • Semi-interpretado • Gran conjunto de bibliotecas

Máquina virtual

• La máquina virtual garantiza la portabilidad del código • Tipos de aplicaciones java: – Standalone (main y maquina virtual) – Applets (en la máquina virtual del navegador – Servlets J2EE (ejecutados en un servidor de aplicaciones Web) Java para Macintosh 01010101 Programa Java Compilador Programa Java en Bytecode Java para Windows 01010101 Java para Linux 01010101

Aplicaciones de Java

Sistemas embebidos Java Server Faces Servidor Servlets JINI JavaSpaces Java Server Pages JNI Programación WWW java.* Applets Java Web Start J2ME JavaBeans Programación gráfica Bases de datos JDBC Programación distribuida Java3D Programación UI Java2D AW T CORBA Enterprise JavaBeans RMI SWT Swing

Versiones de Java

Historia del lenguaje

1991

: El proyecto secreto “Green Team” equipado con 13 personas, fue designado por Sun para anticipar y planear las futuras tendencias en el mundo de la informática. Este proyecto a puertas cerradas fue impulsado por Patrick Naughton, Mike Sheridan y James Gosling.

1992

: Se presenta Star7: una versión demo funcional de un controlador de un dispositivo de entretenimiento familiar interactivo, con una interfaz de usuario animada en una pantalla sensible al tacto.

Estaban tentando a las compañías de cable con la idea de cómo se debían ver sus redes. Era interactivo, y los usuarios podían leer y escribir información en el sistema. Pero las compañías “no querían perder mucho control”. Era demasiado avanzado para la época, y el equipo de desarrollo, que para ese momento ya eran 70, todavía buscaba un mercado al que le pudiese interesar la idea.

Historia del lenguaje

1993

: Llegó Mosaic como una manera amigable de acceso a la Web, revolucionando la percepción del público. Internet estaba siendo transformada en la misma red que Sun quería convencer a las compañías de cable que deberían estar construyendo. Todas las cosas que querían hacer en general encajaban perfectamente con la forma en que las aplicaciones estaban escritas, entregadas y usadas en Internet. Era simplemente un accidente increible. Y fue obvio desde ese momento que Java y la Web eran una pareja perfecta hecha en el cielo.

1994

: El equipo retornó para trabajar en un clon de Mosaic basado en la tecnología Java, al cual llamaron “WebRunner” (en honor a la película Blade Runner) y que luego se difundió oficialmente bajo el nombre de HotJava TM

.

Historia del lenguaje

1995

: La demo que cambió la historia: “Hollywood conoce Silicon Valley”. Se realiza una demostración del potencial de Java a través de una animación de una molécula.

Un mes mas tarde, el equipo estaba preparado para publicar el código binario del navegador en su versión 1.0a, y hacerlo público para descargas públicas y privadas en Internet. Querían que el código fuera testeado por sus amigos y por un grupo mas o menos pequeño de gente de una red informal de desarrolladores.

El 22 de Marzo, Lisa Poulson coordinó con el periódico San Jose Mercury News para escribir una historia sobre la tecnología Java basada en el lanzamiento oficial que vendría pronto. El problema: en el artículo se mencionaba un sitio web que todavía ni existía, por lo cual el equipo tuvo que dedicarse a montar un website en pocas horas.

Historia del lenguaje

Eric Schmidt y George Paolini establecen acuerdos con Marc Andreessen de Netscape para integrar Java technology en el omnipresente Netscape. Deciden revelar dicho acuerdo en esa misma convención, lo cual le dio un giro inesperado al release.

Es allí cuando Java se introduce en Internet. Netscape 2.0 introduce la primera JVM (Máquina virtual Java) en un navegador WWW con la filosofía Java: “Write once, run everywhere” •

1996

: Se libera la versión JDK 1.0. Se realiza la primer conferencia JavaOne developer. Se anuncian las tecnologías JavaBeans y Servlets. Se anuncia el primer compilador Just-In-Time (JIT), la Java Card API y finaliza el año con la JDK 1.1 beta.

1997

: Aparece Java 1.1 final. Se anuncia el lanzamiento del JavaBeans Development Kit, el Java Servlet Developers Kit, la JNDI API, los Enterprise Java Beans, y las Java Foundation Classes.

Historia del lenguaje

1998:

Java 1.2 (Java 2). Plataforma muy madura.

Apoyado por grandes empresas: IBM, Oracle, Inprise, Hewtlett Packard, Netscape, Sun. VISA anuncia la primera tarjeta inteligente basada en la tecnología Java Card. Se formaliza el Java Community Process.

1999:

Java Enterprise Edition. Java comienza a ser una plataforma de desarrollo profesional. Sumado a esto se lanza la J2ME.

2000:

Se anuncia el lanzamiento de la API de Java para XML y la J2SE 1.3.

2001:

Se publica el catálogo de patrones para J2EE. Se publica Java Web Start 1.0

2002:

Se publica el Java Web Services Developer Pack, más la versión 1.4 Beta de J2EE •

2004:

Se lanza la versión 1.5 de Java conocida como Tiger.

Hola Mundo

/* * Example HelloWorld * Prints the message "Hello, World!“ */

public class HelloWorld { public static void main(String[] args) { System.out.println( "Hello, world.” ); } }

Palabras reservadas

abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while

Tipos Simples

Tipos Simples boolean char byte short int long float double void Tamaño

1-bit 16-bit 8-bit 16-bit 32-bit 64-bit 32-bit 64-bit -

Valor Mínimo

Unicode 0 -128 -2 15 -2 31 -2 63 IEE754 IEE754 -

Valor Màximo

Unicode 2 16 -1 +127 +2 15 -1 +2 31 -1 +2 63 -1 IEE754 IEE754

Tipos Wrapper Boolean Character Byte Short Integer Long Float Double Void

Sistema de tipos

© 2003 Brooks/Cole - Thomson Learning ™

Arrays: tipos parametrizables

int lista [] = {1,2,3,4,5}; for (int i = 0; i< lista.length; i++){ lista[i] = lista[i] + 1; System.out.println(lista[i]); } int lista2[] = new int[10]; char lista_char[] = new char[100]; char lista_char2 = {‘a’,’b’,’c’};

Los arrays en Java son de tamaño fijo y solo indexables por enteros (0..size)

Bloques

Comandos y secuenciadores

if

(expressBool) { ....

}

else

....

{ } selector: char,byte,short,int

switch case

(selector) { valor1: instrucció1;

case

...

break

; valor2: ...........

default

:

instruccióN;

}

Comandos y Secuenciadores

Bucles FOR:

• for (; ;) for (int i=0; i<10; i++) {...} •

Bucles DO-WHILE

do { ...

} while (expressioBooleana);

Bucles WHILE

while (expressioBooleana) { ...

}

Clases en Java

• Lenguaje tipado estáticamente • Legible • No separación en fichero interfaz e implementación.

• Lenguaje semi-interpretado: Máquina Virtual Java + bytecodes • Atributos y variables de clase • Métodos de instancia y de clase • Incluye metaclases (

Reflexión

)

Ejemplo: Cuenta

class Cuenta { private String titular; private private int int saldo; codigo; private int [] ultOper; private static int ultimoCodigo = public Cuenta (String quien) { 0 ; public static int nuevoCodigo () { return ++ultimoCodigo;} saldo= 0 ; titular=quien; codigo = nuevoCodigo(); ultOper = new int [ 100 ];} public void reintegro ( int suma) { if (puedoSacar(suma)) saldo=saldo-suma;}; public void ingreso ( int suma) { saldo=saldo+suma;} public int getSaldo () { return saldo; } private boolean puedoSacar( int suma) { return (saldo >=suma);} }

Creación de Objetos

• •

Constructores: métodos con el nombre de la clase que no devuelven nada (void).

Acceso a las variables de instancia de la clase mediante métodos de instancia (set y get).

Cuenta

c = new Cuenta (“pedro”); c.reintegro(10000); c.ingreso(20000); int x = c.getSaldo(); “

Propiedades de clase: static

class Cuenta { private String titular; public static int interes=3; public int setInteres(int cantidadPts) {

interes= cantidadPts

}

¿ Que ocurre ?

Propiedades de clase

• No podemos acceder desde variables de clase a variables de instancia.

// Método de clase public static int setInteres(int cantidadPts) {

interes= cantidadPts

}

Propiedades de clase

public class HelloWorld { public static void main(String[] args) { Cuenta.setInteres(12); Math.sqrt(9); } }

Las propiedades de clase son válidas para todos los objetos de la clase.

Clases Java y Ocultación de Información

• • •

package

– accesible por las clases del paquete, no accesible a los clientes del paquete •

public

– accesible por todas las clases

private

– sólo accesible por los métodos de la clase

protected

– accesible por las clases del paquete y por las subclases

Visibilidad

The class itself Clases del mismo paquete Subclases de otro paquete No-subclases de otro paquete Si Si public protected Si Si packag e Si Si Si Si private Si No Si No No No No No

Asignación

Un objeto asociado a una variable cambia cuando se asignación.

evalúa una expresión de

variable = expresión

miObjeto= otroObjeto;

• E

l operador

=

no hace una copia del objeto

Asignación y cloning

Point p = new Point (1,1); Point p2 = p; p2.setLocation(120,120);

//Aliasing

System.out.println("Valor de p:" + p.getX()); System.out.println("Valor de p2:" + p2.getX()); Point p3 = (Point)p.

clone

(); p3.setLocation(40,40); System.out.println("Valor de p:" + p.getX()); System.out.println("Valor de p3:" + p3.getX());

Copia en Java

• La clase

Object

incluye el método

protected Object clone( ) {

..} ..} que implementa una copia superficial.

• Para poder clonar objetos de una clase se debe – Declarar que implementa la interfaz

Cloneable

– Redefinir y hacer público el método

clone()

– Dejar la versión original (copia superficial) o bien hacer una copia de mayor profundidad.

Paso de Parámetros

class PassByValue { public static void modifyPoint(Point pt, int j) { pt.setLocation(5,5); j = 15; } public static void main(String args[]) { Point p = new Point(0,0); int i = 10; modifyPoint(p, i); //1 //2 //3 } }

Arrays y Clases

Cuenta lista_cuentas [] = new Cuenta[10]; O bien: Cuenta lista_cuentas[]; lista_cuentas = new Cuenta [10]; ¿ Qué ocurre si ahora intento hacer lo siguiente ?

lista_cuentas[0].ingreso(100);

Arrays y clases

• La inicialización del array no instancia n objetos del tipo establecido !!!

• Los deja a null por defecto Cuenta lista_cuentas [] = new Cuenta[10]; Cuenta micuenta = new Cuenta(“pedro”); Cuenta sucuenta = new Cuenta(“pepe”); lista_cuentas[0] = micuenta; lista_cuentas[1] = sucuenta; lista_cuentas[0].ingreso(100);

Arrays: Tipo parametrizable

int lista [] = new int[100]; lista[0]=1; for (int i=0;i

Tipos básicos y clases

• Tipos Wrapper, una clase por cada tipo básico, permite conversión Clase <-> Tipo primitivo (Integer, Float, Char, Double) int a =1; int b= 2*3; Integer awrap = new

Integer

(a); int x = awrap.

intValue

();

La clase java.lang.String

• Es una clase, pero tiene facilidades con el constructor • Si se quiere eficiencia en la concatenación y manejo de cadenas usar StringBuffer.

String nombre = new String(“pedro”); Es equivalente a: String nombre = “pedro”; String total = nombre + ” garcia”;

Concepto de Metaclase: RTTI

• Run Time Type Identification • Object – Class getClass() • Class – getFields – getMethods – getName – (...) Cuenta c = new Cuenta(“pedro”); Class miclase = c.getClass(); System.out.println(miclase.getName());

Agrupación de clases: Package

• package pedro.utils; • import pedro.utils.*; • import pedro.*; // No es jerárquico • import pedro.utils.Cosa; Paquetes Java – java.lang --- general – java.awt --- GUI – java.io --- I/O – java.util --- utilities – java.applet --- applet – java.net --- networking

Relaciones entre clases Composicíón: Tiene - Un

Student

-name : String -gpa : float * * 1 1

Address

-streetAddress : String -city : String -state : String -zipCode : String

Faculty

Relaciones entre clases

Herencia: Es -Un

Student GraduateStudent UndergraduateStudent MasterStudent PhDStudent

Clientela

Una Cuenta tiene un propietario de tipo Cliente: Class Cuenta { private Cliente propietario; (…) } Un Banco tiene N cuentas: Class Banco { private Cuenta lista_cuentas[]; (…) }

Herencia en Java

public class X extends Y {...}

Sintaxis de clase

[ ClassModifiers ]

class

[

extends

SuperClass ] ClassName [

implements

Interface1, Interface2 ...]

{ }

ClassMemberDeclarations • La clase Object • this y super

La clase Object

protected Object

clone

() Creates and returns a copy of this object.

boolean

equals

(Object obj) Indicates whether some other object is "equal to" this one.protected void

finalize

() Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

Class

getClass

() Returns the runtime class of an object String

toString

() Returns a string representation of the object.

Object

• Todas las clases heredan de Object – Class Cuenta [extends Object] • Se pueden redefinir los métodos equals, clone y toString.

• Hay que tener mucho cuidado al comparar objetos entre si, no es igual que comparar tipos básicos: int x = 3; int y = 5; if (x ==y) then (…) Cuenta c = new Cuenta(“pedro”); Cuenta d = new Cuenta(“pepe); if (c ==d) then (…)

NO !!!!

Ejemplo

Class Coche { private String marca; private int precio; public

Coche

(String marca, int precio){ this.marca = marca; this.precio = precio; } public int

getPrecio

(){ return precio; }

Ejemplo

public String

getMarca

(){ return marca; } public boolean

equals

(Object obj){ Coche otro =

(Coche)

obj; return (otro.getPrecio()==this.precio)&&(otro.getMarca().equals(this.m

arca); }

Ejemplo

protected Object

clone

(){ return new Coche (marca, precio); } public String

toString

(){ return “(“+marca+”,”+precio+”)”; }

Ejemplo

public static void

main

(String args[]){ Coche micoche = new Coche (“bmw”,100); Coche otrocoche = new Coche (“seat”,10); if (micoche.equals(otrocoche)) System.out.println(“iguales”); System.out.println(micoche); }

Tipos de herencia

• Para referirse a la instancia actual usamos

this

para referirnos a nuestra clase padre usamos

super

.

y • Herencia de redefinición de métodos – Refinamiento – Reemplazo • Herencia abstracta • Herencia de interfaces

Ejemplo: La granja de animales

Herencia de reemplazo

Herencia de refinamiento

Clases abstractas

• Algún método no se implementa • No podemos instanciar una clase abstracta • La clase abstracta puede tener métodos no abstractos • La clase abstracta debe ser

heredada

.

public

abstract

class Figura { public

abstract

dibujar(); }

Ejemplo herencia abstracta

Cuidado con la herencia abstracta !

Si la clase Animal tiene aunque sea un método abstracto entonces es ua clase abstracta: Animal mianimal = new Animal ();

ERROR

!!!!

No podemos instanciar una clase abstracta !!

¿ Qué pasaría si hacemos :?

mianimal.habla(); Si una clase hereda de una clase abstracta ha de implementar los métodos abstractos de la clase padre, o será también abstracta

Polimorfismo

• •

Tipo estático:

– Tipo asociado en la declaración

Tipo dinámico:

– Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecución •

Conjunto de tipos dinámicos:

– Conjunto de posibles tipos dinámicos de una entidad

Ejemplo: A oa: A; ob: B; oc; C; B C

te(oa) = A {A,B,C,D,E,F} ctd(oa) =

D E F

te(ob) = B ctd(ob) = {B, D, E} te(oc) = C ctd(oc) = {C,F}

Conexión polimorfa

(antes) p (POLIGONO) (después) r p:POLIGONO; r:RECTANGULO (RECTANGULO) • Cuando el origen y el destino tiene tipos diferentes:

a) asignación:

p = r;

polimorfa

-- p es una

entidad b) paso de parámetros:

comer (Animal a ) f es una

rutina polimorfa, me puedo comer cualquier animal (perro, gato, …)

Sólo

se permite para entidades destino de

tipo referencia

Polimorfismo y ligadura dinámica

Java es un lenguaje

tipado estáticamente •

La

ligadura

de un mensaje a un método concreto se realiza en

tiempo de ejecución • ¿Qué versión de perímetro se ejecuta

en cada mensaje?

f= new Poligono (); {i} f.perimetro(); r = new Rectangulo(); r.perimetro(); f=r; f.perimetro(); {ii} {iii}

Ejemplo polimorfismo

Ejemplo polimorfismo (2)

Polimorfismo

Animal a = new Animal(); Perro p; a = p; Object x; Perro p = new Perro(); x = p; Perro p2 = (Perro) x;

Polimorfismo y castings

Object list [] = new Object[3]; String s = “lala”; Perro p = new Perro(); list[0] = s; list[1] = p; Object x = list[0]; Perro p2 =

(Perro)

list[1];

Polimorfismo

Object list [] = new Object[3]; Integer i1 = new Integer(3); int z = 74; Integer i2 = new Integer(4); list[0] = i1; list[1] = i2; Object x = list[0]; Integer r2 =

(Integer)

list[1]; int resul = z2.intValue();

Interfaces

• Son clases en las que todos las propiedades son estáticas y finales y todos los métodos son abstractos.

• Permiten la herencia múltiple, y separación de especificación e implementación.

• Se aplican las mismas reglas que la herencia de clases en las asignaciones polimórficas

interface

Persona

interface

Perro { { public void habla(); public void ladra(); } }

Interfaces y herencia

public class Mutante implements Persona, Perro { public void habla() { System.out.println(“Soy una persona”); } public void ladra() { System.out.println(“GUAU”); } }

Interfaces y polimorfismo

Mutante m = new Mutante(); Persona p = m; p.habla(); Perro p = m; m.ladra();

Interfaces

class Prueba { public static void ladra (Perro p) { p.ladra(); { public static void habla(Persona p) { p.habla() }

Interfaces

Mutante m = new Mutante(); Prueba.habla(m); Prueba.ladra(m); No podemos instanciar una interface, pero si asignarle una instancia de una clase que implemente esta interface: Persona p = new Mutante;

Excepciones Java

• “Proporcionan una

manera limpia

errores sin complicar el código” de comprobar • “Proporcionan, además, un mecanismo para

señalar directamente los errores

sin necesidad de usar indicadores (atributos, parámetros)”.

• “Son lanzadas cuando se detectan

situaciones imprevistas

de error”.

Excepciones Java

BufferedReader br; int codigoProducto = Integer.parseInt (br.readLine() ) • Puede suceder algo inesperado como que: – br represente un fichero sobre un disco flexible que se ha extraído – br represente una conexión en red y se produzca una caída de la red – br represente un fichero en mal estado sobre el disco duro – el usuario introduzca un carácter no numérico – el usuario introduce un código numérico incorrecto

Situaciones que deben ser manejadas por excepciones

70

Excepciones Java

• Las excepciones son objetos. • Hay dos tipos: – –

Comprobadas No comprobadas

• Necesidad de definir subclases de Exception o RunTimeException .

Jerarquía de Tipos de Excepciones

Throwable Error Exception RunTimeException Comprobadas No comprobadas

Excepciones Comprobadas

• Subclases de

Exception

• Un método que lance una excepción comprobada,

debe especificarlo en su signatura

.

• El código que invoca un método que puede lanzar una excepción comprobada

debe manejarla

mediante una cláusula

try-catch.

• Situaciones comprobadas por el

compilador

Excepciones No Comprobadas

• Subclases de

RuntimeException

• Un método puede lanzar una excepción no comprobada,

sin especificarlo en su signatura

.

• El código que invoca un método que puede lanzar una excepción no comprobada

no debe manejarla

. • Es recomendable listar todas las excepciones en la signatura para facilitar su uso.

¿Cómo elegimos si una nueva excepción es comprobada o no comprobada?

74

Uso de Excepciones Comprobadas

public class

ClaveNoExiste

extends

Exception

{ public ClaveNoExiste() { super(); } } // método en TablaHash public void cambiarValor (String clave, Object valor) }

throws

ClaveNoExiste { if (obtener(clave) == null)

throw

new ClaveNoExiste (); … TablaHash unaTabla; ...

try

{ unaTabla.cambiarValor(s,v);}

catch

(ClaveNoExiste e) {...}

finally

{...} 75

Excepciones Comprobadas

¿Qué puede hacer el cliente de un método que lanza una excepción comprobada?

1) Capturarla y manejarla 2) Capturarla y asociarla a una de las excepciones declaradas en el método.

3) Declararla en la cláusula

throws

y no manejarla, con lo que se propaga al método que lo invocó .

Excepciones No Comprobadas

¿Qué puede hacer el cliente de un método que lanza una excepción no comprobada?

1) Si no la captura se propaga al método que lo invocó.

2) También puede capturarla y manejarla.

3) Capturar la excepción y asociarla a una de las excepciones declaradas en el método.

Excepciones Java

try

{ “Sentencias con mensajes que pueden provocar excepciones” }

catch

(unaExcepcion e) {“codigo manejo excepción” }

catch

(OtraExcepcion e) {“codigo manejo excepción” }

finally

{...} // se ejecuta se lance o no una excepción

Excepciones en Java

¡Una excepción

es un objeto!

try

{ //sentencias }

catch

(

TipoExcepcion1

e){ //manejar excepción }

catch

(

TipoExcepcion2

e){ //manejar excepción } ...

Ej: cerrar ficheros }

finally

{ //sentencias que se ejecutan

SIEMPRE //salte o no una excepción

Ejemplos

} { public static int factorial (int n) throws NonPositiveException if (n<=0) throw new NonPositiveException (“Num.factorial”); …

try

} { Num.factorial(y);

catch

(NonPositiveException e) { … }

Ejemplos

public static int search (int [] a, int x) throws NullPointerException NoEncontradoException { … }

try

{ …;

try

{ x = Arrays.search(v,7);}

catch

(NullPointerException e) { throw new NoEncontradoException(); } }

catch

(NoEncontradoException e) {..} ¿Debo declarar

NullPointerException

en la signatura?

¿Es acertado considerar la situación de encontrado como una excepción?

elemento no

Captura de excepciones no comprobadas

try { x = y [n]; i = Arrays.search(z, x);} catch (IndexOutOfBoundsException e) { “manejar la excepción en el caso del acceso y[n]” } No se sabe la procedencia exacta de la excepción no comprobada

IndexOutOfBoundsException

Restringir el ámbito de la sentencia

try

Ejemplos

public class Arrays { public static int min (int [] a) throws NullPointerException, EmptyException { // EFECTO: Si a es null lanza NullPointerException, si no si a // está vacío lanza EmptyException, si no retorna el valor mínimo // del array

a

int m; try { m = a[0]; } catch (IndexOutOfBoundsException e) { throw new EmptyException(“Arrays.min”); } for (int i = 1; i < a.length; i++) if (a[i] < m) m = a[i]; return m; }

Ejemplos

public class Arrays { public static boolean sorted (int [] a) throws NullPointerException, EmptyException { // EFECTO: Si a es null lanza NullPointerException, si no retorna // true si el array está ordenado en orden ascendente si no false int prev; try { prev = a[0]; } catch (IndexOutOfBoundsException e) { return true; } for (int i = 1; i < a.length; i++) if (prev <= a[i]) prev = a[i]; else return false return true; }

Ejemplo código genérico java.util.Collection

Collection AbstractCollection Vector Stack AbstractList AbstractSet ArrayList LinkedList ArraySet HashSet

Ejemplo: código genérico

• boolean add(Object) • boolean addAll(Collection) • void clear() • boolean contains(Object) • boolean containsAll(Collection) • boolean isEmpty() • Iterator iterator() • boolean remove(Object) • boolean removeAll(Collection) • boolean retainAll(Collection) • int size() • Object[] toArray()

Iteradores

• boolean hasNext() • Object next() • void remove() [implementación opcional] • Por ejemplo:

public void for

(

Iterator

it=c.

iterator()

; it.

hasnext()

;) { System.out.println(it.

next()

); } escribir (

Collection

c) { }

Genericidad y Java

• Java no posee genericidad (hasta el Jdk1.5) • Necesidad de declaraciones de tipo

Object

• Problemas: – Necesidad de conversiones de tipo – No se asegura homogeneidad • Incluye genericidad para arrays private

Cuenta[ ]

Cuenta[100] cuentas = new private

int[ ]

valores = new int [4]

Estructuras de datos polimorfas

• •

Contiene objetos de diferentes clases

Ejemplo:

Array con cualquier variante de Figura

Figura conjFig = new Figura[10]; p= new Poligono(); conjFig r = new Rectangulo(); c = new Circulo();.

t = new Triangulo(); 1 2

conjFig[0]=p; conjFig[0]=r; conjFig[0]=c; conjFig[0]=t;

3 4

Estructuras polimorfas y código genérico

public void dibujarFiguras()

{ for (int i=0;i

Ejemplo colecciones

Ejemplo HashMap

Ejemplo Código genérico

java.util.

Comparator

int

compare

(Object o1, Object o2) Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. boolean

equals

(Object obj) Indicates whether some other object is "equal to" this Comparator.

java.util.

Collections

static void

sort

(List list, Comparator c) Sorts the specified list according to the order induced by the specified comparator.

Ejemplo