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

95
Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López [email protected] /

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

Page 1: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Lenguajes de ProgramaciónTema 3. Paradigma Orientado a

Objetos

Pedro García Ló[email protected]/

Page 2: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Estudio de caso: JavaLenguaje:

• Simple

• Orientado a Objetos

• Robusto

• Arquitectura-neutral (portable)

• Moderno

• Tipado estáticamente

• Semi-interpretado

• Gran conjunto de bibliotecas

Computadora

Java Virtual Machine

Java APIs

Programa Java

Page 3: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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)

ProgramaJava

CompiladorProgramaJava en

Bytecode

Java para Macintosh

Java para Windows

Java para Linux

01010101

01010101

01010101

Page 4: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Aplicaciones de Java

Enterprise JavaBeansEnterprise JavaBeans

RMIRMI

Programación distribuidaProgramación distribuida

CORBACORBA

JDBCJDBCBases de datosBases de datos

Java3DJava3D

Java2DJava2D

Programación gráficaProgramación gráfica

JINIJINI

Sistemas embebidosSistemas embebidos

JavaSpacesJavaSpaces

AppletsApplets

WWWWWW

Java Web StartJava Web Start

ServletsServlets

Java Server PagesJava Server Pages

ServidorServidor

Java Server FacesJava Server Faces

JavaBeansJavaBeans

JNIJNI

ProgramaciónProgramación

java.*java.*

J2MEJ2ME

AWT

AWT

Programación UIProgramación UI

SwingSwingSWTSWT

Page 5: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Versiones de Java

Page 6: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 7: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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 HotJavaTM.

Page 8: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 9: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 10: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 11: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Hola Mundo

/* * Example HelloWorld * Prints the message "Hello, World!“ */public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world.”); }}

Page 12: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Palabras reservadas

abstractbooleanbreakbytebyvaluecasecastcatchcharclassconstcontinue

defaultdodoubleelseextendsfalsefinalfinallyfloatforfuturegeneric

gotoifimplementsimportinnerinstanceofintinterfacelongnativenewnull

operatorouterpackageprivateprotectedpublicrestreturnshortstaticsuperswitch

synchronizedthisthrowthrowstransienttruetryvarvoidvolatilewhile

Page 13: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Tipos Simples Tamaño Valor Mínimo Valor Màximo Tipos Wrapper

boolean 1-bit - - Boolean

char 16-bit Unicode 0 Unicode 216-1 Character

byte 8-bit -128 +127 Byte

short 16-bit -215 +215-1 Short

int 32-bit -231 +231-1 Integer

long 64-bit -263 +263-1 Long

float 32-bit IEE754 IEE754 Float

double 64-bit IEE754 IEE754 Double

void - - - Void

Tipos Simples Tamaño Valor Mínimo Valor Màximo Tipos Wrapper

boolean 1-bit - - Boolean

char 16-bit Unicode 0 Unicode 216-1 Character

byte 8-bit -128 +127 Byte

short 16-bit -215 +215-1 Short

int 32-bit -231 +231-1 Integer

long 64-bit -263 +263-1 Long

float 32-bit IEE754 IEE754 Float

double 64-bit IEE754 IEE754 Double

void - - - Void

Tipos Simples

Page 14: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Sistema de tipos

© 2003 Brooks/Cole - Thomson Learning™

Page 15: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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)

Page 16: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Bloques

Page 17: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Comandos y secuenciadores

if (expressBool) { ....} else { ....}

switch (selector) { case valor1: instrucció1; break; case valor2: ........... ... default: instruccióN;}

selector: char,byte,short,int

Page 18: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Comandos y Secuenciadores• Bucles FOR:

for (<inicialització>; <continuar si ...>;<increment>)for (int i=0; i<10; i++) {...}

• Bucles DO-WHILEdo {...

} while (expressioBooleana);

• Bucles WHILEwhile (expressioBooleana) {

...

}

Page 19: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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)

Page 20: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo: Cuentaclass Cuenta { private String titular; private int saldo; private int codigo; private int[] ultOper; private static int ultimoCodigo = 0;

public static int nuevoCodigo () {return ++ultimoCodigo;} public Cuenta (String quien) {

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);}

}

Page 21: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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();

Page 22: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Propiedades de clase: static

class Cuenta { private String titular; public static int interes=3;

public int setInteres(int cantidadPts){

interes= cantidadPts}

¿ Que ocurre ?

Page 23: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Propiedades de clase

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

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

interes= cantidadPts}

Page 24: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 25: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

Page 26: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Visibilidad

public

protected

package

private

The class itself Si Si Si SiClases del mismo paquete 

Si Si Si No

Subclases de otro paquete 

Si Si No No

No-subclases de otro paquete

Si No No No

Page 27: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Asignación• Un objeto asociado a una variable cambia

cuando se evalúa una expresión de asignación.

variable = expresión

miObjeto= otroObjeto;

• El operador = no hace una copia del objeto

Page 28: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Asignación y cloningPoint p = new Point (1,1);Point p2 = p;

p2.setLocation(120,120);//AliasingSystem.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());

Page 29: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 30: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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);                        //1            int i = 10;            modifyPoint(p, i);                                   //2                                                                           //3         } }

Page 31: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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);

Page 32: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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);

Page 33: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Arrays: Tipo parametrizableint lista [] = new int[100];

lista[0]=1;

for (int i=0;i<lista.length;i++)

lista[i]=0;

int lista[] = {1,2,3,4};

Perro lista2 = new Perro[100];

lista2[0] = new Perro ();

Object lista3 = new Object [100][100];

Page 34: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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();

Page 35: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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”;

Page 36: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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());

Page 37: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Agrupación de clases: Package

• package pedro.utils;

• import pedro.utils.*;

• import pedro.*; // No es jerárquico

• import pedro.utils.Cosa;– java.lang --- general – java.awt --- GUI – java.io --- I/O – java.util --- utilities – java.applet --- applet – java.net --- networking

Paquetes Java

Page 38: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Relaciones entre clases

-name : String-gpa : float

Student Faculty

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

Address

*1

* 1

Composicíón: Tiene - Un

Page 39: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Relaciones entre clases

Student

GraduateStudent UndergraduateStudent

MasterStudent PhDStudent

Herencia: Es -Un

Page 40: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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[];

(…) }

Page 41: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Herencia en Java

• public class X extends Y {...}

Page 42: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Sintaxis de clase

• La clase Object

• this y super

[ ClassModifiers ] class ClassName   [ extends SuperClass ]   [ implements Interface1, Interface2  ...] {   ClassMemberDeclarations }

Page 43: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

La clase Objectprotected  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.

Page 44: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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 !!!!

Page 45: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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;

}

Page 46: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplopublic String getMarca(){

return marca;

}

public boolean equals (Object obj){

Coche otro = (Coche) obj;

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

}

Page 47: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo

protected Object clone(){

return new Coche (marca, precio);

}

public String toString (){

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

}

Page 48: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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);

}

Page 49: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Tipos de herencia

• Para referirse a la instancia actual usamos this y para referirnos a nuestra clase padre usamos super.

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

• Herencia abstracta• Herencia de interfaces

Page 50: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo: La granja de animales

Page 51: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Herencia de reemplazo

Page 52: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Herencia de refinamiento

Page 53: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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();

}

Page 54: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo herencia abstracta

Page 55: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

Page 56: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

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

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

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

te(oc) = C ctd(oc) = {C,F}

A

ED

CB

F

Ejemplo:

Page 57: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Conexión polimorfa

• Cuando el origen y el destino tiene tipos diferentes:a) asignación:

p = r; -- p es una entidad polimorfa

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

(POLIGONO)p

(antes)

(después)

(RECTANGULO)

r

p:POLIGONO; r:RECTANGULO

Page 58: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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 ();f.perimetro(); {i}r = new Rectangulo();r.perimetro(); {ii}f=r;f.perimetro(); {iii}

Page 59: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo polimorfismo

Page 60: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo polimorfismo (2)

Page 61: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Polimorfismo

Animal a = new Animal();

Perro p;

a = p;

Object x;

Perro p = new Perro();

x = p;

Perro p2 = (Perro) x;

Page 62: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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];

Page 63: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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();

Page 64: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

{

public void habla();

}

interface Perro

{

public void ladra();

}

Page 65: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Interfaces y herenciapublic class Mutante implements Persona, Perro

{

public void habla()

{ System.out.println(“Soy una persona”);

}

public void ladra()

{ System.out.println(“GUAU”);

}

}

Page 66: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Interfaces y polimorfismo

Mutante m = new Mutante();

Persona p = m;

p.habla();

Perro p = m;

m.ladra();

Page 67: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Interfacesclass Prueba

{

public static void ladra (Perro p)

{ p.ladra();

{

public static void habla(Persona p)

{ p.habla()

}

Page 68: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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;

Page 69: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Excepciones Java

• “Proporcionan una manera limpia de comprobar errores sin complicar el código”

• “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”.

Page 70: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

70

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

Page 71: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Excepciones Java

• Las excepciones son objetos. • Hay dos tipos:

– Comprobadas– No comprobadas

• Necesidad de definir subclases de Exception o RunTimeException.

Page 72: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Jerarquía de Tipos de Excepciones Java

Object

Throwable

ExceptionError

RunTimeException

No comprobadas

Comprobadas

Page 73: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

Page 74: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

74

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?

Page 75: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

75

Uso de Excepciones Comprobadas

public class ClaveNoExiste extends Exception {public ClaveNoExiste() { super(); }

}// método en TablaHashpublic 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 {...}

Page 76: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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ó.

Page 77: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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.

Page 78: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

Page 79: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Excepciones en Java

try{

//sentencias

}catch (TipoExcepcion1 e){

//manejar excepción

}catch (TipoExcepcion2 e){

//manejar excepción

} ...

finally{

//sentencias que se ejecutan SIEMPRE

//salte o no una excepción

}

Ej: cerrar ficheros

-Se evalúan en orden

- Sólo se ejecuta una¡Una excepciónes un objeto!

Page 80: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplos

public static int factorial (int n) throws NonPositiveException{

if (n<=0) throw new NonPositiveException (“Num.factorial”);…

}

try { Num.factorial(y); } catch (NonPositiveException e) { … }

Page 81: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplospublic 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 elemento no encontrado como una excepción?

Page 82: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

Page 83: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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 aint 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; }

Page 84: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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 falsereturn true; }

Page 85: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo código genérico

S ta ck

V e c to r A rra yL is t L in ke d L ist

A b s tra c tL ist

A rra yS et H a sh S et

A b s trac tS e t

A b s tra c tC o lle c tion

C o lle c tio n

java.util.Collection

Page 86: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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()

Page 87: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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

public void escribir (Collection c) { for (Iterator it=c.iterator(); it.hasnext();) { System.out.println(it.next()); }}

Iteradores

Page 88: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

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[ ] cuentas = new Cuenta[100]

private int[ ] valores = new int [4]

Page 89: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Estructuras de datos polimorfas

• Contiene objetos de diferentes clases

• Ejemplo: Array con cualquier variante de Figura

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

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

1

2

3

4

conjFig

Page 90: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Estructuras polimorfas y código genérico

public void dibujarFiguras()

{

for (int i=0;i<conjFig.length;i++)

conjFig[i].dibujar();

}

Page 91: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo colecciones

Page 92: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo HashMap

Page 93: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo Código genéricojava.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.

Page 94: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es

Ejemplo

Page 95: Lenguajes de Programación Tema 3. Paradigma Orientado a Objetos Pedro García López pgarcia@etse.urv.es