Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Diapositiva 1 Programación Orientada a Objetos Cátedra: Paradigmas de Programación Universidad Tecnológica Nacional, Facultad Regional Mendoza - Dpto. Ing. en Sistemas de Información _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 2 Caso: un ejemplo en C struct Raza { char *nmb; }; struct Perro { Raza *tipo; float peso; }; int main(void) { Raza r; Perro a; r.nmb = (char *)malloc(8); strcpy(r.nmb, "Bulldog"); a.tipo = &r; a.peso = 34.5; cout << a.tipo->nmb << “,” << a.peso << endl; } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 3 � Clases � Son tipos compuestos (similar a struct) � Atributos (variables) � Métodos (procedimientos o funciones) � Sirven “de plantilla” para crear objetos � Pueden tener cero o más instancias (objetos) � Objetos � Son instancias de clases � Poseen los atributos y métodos definidos en la clase � Ocupan espacio en memoria de datos (dinámica) � Tienen comportamiento (implementado por métodos) � Existen estereotipos (interface, control, entidad) Clases y Objetos Clase perro instancias _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 4 Caso: representación en Java class Perro { public final Raza tipo; private float peso; public Perro(Raza r) { tipo = r; } public void setPeso(float p) { peso = p; } public float getPeso() { return peso; } } class Raza { public final String nmb; public Raza(String s) { nmb = s; } } public class Programa { public static void main(String []arg) { Raza r = new Raza(“Bulldog"); Perro a = new Perro(r); a.setPeso(34.5); System.out.println( a.tipo.nmb + “,” + a.getPeso() ); } } acceso dinámico sin punteros restricciones de acceso a miembros _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 5 Conceptos básicos sobre POO � Definición de clases � Implementación de objetos � Identidad de objetos vs. nombre � Variables de instancia � Métodos de instancia � Calificadores de acceso �public y private � Atributos públicos deberían ser constantes � Mensajes � Estado de un objeto Clase perro instancias Boby Rufus Picho Variable1 Variable2 Método1 Método2 Método3 … … O b je to _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 6 Relaciones entre clases y objetos � de Asociación �Cardinalidad, nombre y rol �Estáticas vs. dinámicas �Formas � Asociación � Agregación � Composición �Clases asociativas � de Uso � de Instanciación o Dependencia n tiene construye Modelo: carga Chasis:82928281 Motor: 19282828 título RNA venta 1 inscripto 1 tieneUn 1 formadoPor 1 parteDe 1 esDe _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 7 Caso: Camiones Titulo prop : String Titulo() (from Legal ) Fabrica nombre : String Fabrica() construye() (from modelovehiculos) Motor numero : Integer Motor() setCamion() (from Repuestos) Rueda marca : String rodaje : int Rueda()setRodaje() getRodaje() (from Repuestos) RNA ID : String = "Mendoza" registrar() mostrar() (from Legal ) Chasis numero : Integer Chasis() (from modelovehiculos) Camion marca : String carga : int prop : String Camion() setCarga() setProp() getCarga() getProp() setMotor() registrar() setRuedas() (from modelovehiculos) 1 1 +esDe 1 -tieneUn 1 0..n -tiene[] 0..n 0..n -inscripto[] 0..n construye 1 1 +parteDe +formadoPor 1 1 Conceptos �Packages �Arreglos �Iterador �Calificador de acceso �Métodos get()/set() �Clases asociativas �Instanciación �Agregación �Asociación �Composición _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 8 � de Herencia �Superclase (clase base) � Calificador de acceso: protected � Clases abstractas �Subclases (clases derivadas) � Constructores: super() y this() � Accesores: super y this � Re-definición de métodos � Polimorfismo � Métodos abstractos � Envío de mensajes y despachador de métodos � Herencia (por generalización) � Delegación de funcionalidades Relaciones entre clases y objetos Vehiculo es un instancias instancias _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 9 Caso: Vehículos Conceptos �Superclase �Subclases �Clase abstracta �protected �super() y this() �super y this �Re-definición �Polimorfismo �Método abstracto _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 10 Concepto de objeto Reloj r = new Reloj(); r.ponerHora(“23: 45: 12”); r.ponerFecha(“25/06/2012”); Comportamientos Poner hora Poner fecha hora fecha ponerHora ponerFecha Reloj especificaciones de objetos (modelo de un auto, un tipo de seguro, …) eventos (un accidente, un llamado, un vuelo, …) interacciones entre objetos ( una compra, una venta, ...) cosas tangibles (auto, avión, …) roles (cliente, empleado, jefe, ...) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 11 class abstract U { private int a; protected float b; public abstract void m1(); public void m2() {…} } class T extends U { private int a; private float c; public void m1() {…} public void m2() { super.m2(); } } class W { public void m3() { T obj = new T(); obj.m1(); obj.m2(); } } obj código T: m2 código T: m1 código U : m2 a c ptrTDM ptrTDM heapstack ba Despachador de métodos _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 12 Semántica de… � Calificación constante �Métodos “inline” �Atributos y parámetros � Métodos set/get (accesor) � Arreglos �de tipos primitivos �de objetos � Operaciones con objetos �Duplicación �Destrucción de objetos Clases utilitarias Object protected Object clone() boolean equals(Object obj) protected void finalize() Class getClass() int hashCode() ... System static void exit(int) static void gc() public static final InputStream in public static final PrintStream out ... Class String getName() ... _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________ Diapositiva 13 Uso d packages � Classpath � Parte pública � Parte privada � Exportación e importación � acceso a componentes Main A B CR L � Packages � Classpath � Parte pública y privada � Exportación e importación � Acceso a componentes _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 14 Gestión de errores leerArchivo { abrir el archivo; determinar su tamaño; asignar memoria; leer archivo a memoria; cerrar el archivo; } Qué pasa si… • no se puede determinar la longitud del archivo • no hay suficiente memoria libre • falla la lectura • no se puede cerrar el archivo Leer datos de archivo y almacenarlos en heap int leerArchivo { inicializar codError = 0; abrir el archivo; if (archivoAbierto) { determinar la longitud del archivo; if (obtenerLongitudArchivo) { asignar suficiente memoria; if (reservarMemoria) { leer el archivo a memoria; if (errorLectura) codError = -1; } else codError = -2; } else codError = -3; cerrar el archivo; if (errorAlCerrar) codError = -4; else codError = 1; } else codError = -5; return codError; } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 15 Manejador de excepciones int leerArchivo { inicializar codError = 0; try { abrir el archivo; determinar su tamaño; asignar suficiente memoria; leer el archivo a la memoria; cerrar el archivo; } catch (errorAbrirArchivo e1) { codError = -5; } catch (errorDeterminacionLongitud e2) { codError = -3; } catch (errorResrevaMemoria e3) { codError = -2; } catch (errorLectura e4) { codError = -1; } catch (errorCerrarArchivo e5) { if (errorAlCerrar) codError = -4; else codError = 1; } } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 16 POO en Java: Excepciones try { ... } catch (clase1 x){ ... } catch (clase2 y){ ... } catch (clase3 z){ ... } finally { ... } Bloque try Bloque catch1 Bloque catch2 Bloque catchn Bloque finally _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 17 POO en Java: Excepciones void métodoC()throws EE{ ... if (?)throw new EE(); ... } ...... Throwable Error ExceptionVirtualMachineError IOException RuntimeException EE ... class EE extends Exception{ ... } void métodoB(){ ... métodoC(); ... } void métodoB(){ ... try { métodoC();} catch (EE x){ ... } ... } void métodoB()throws EE{ ... métodoC(); ... } void métodoA(){ ... try { métodoB();} catch (EE x){ ... } ... } a lt e rn a ti v a s _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 18 Caso: Excepciones ErrorVelocidadNegativa objDondeOcurre() ponerEnCero() Package: errores _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 19 POO en Java: componentes visuales Gestor de eventos (event-driven) Implica escribir el código para atender el evento No secuencial Dependiente de sucesos externos al programa Evento Señal de que algo ocurrió enviadaal programa Una alarma, paro de un motor, un click, … Manejo de eventos Handlers uno por evento implementan el comportamiento Fuentes censores, teclado, mouse, el S.O… Input controller Apl1 Apl2 Apln … Gestores: GUI, Eventos cola cola cola Implementar una interface visual para el modelo Vehículos Fuentes de eventos Cola de eventos _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 20 Conceptos varios � Métodos de clase • Restricciones de acceso � Objetos persistentes • Calificador transient � Herencia múltiple • Interfaces � Clases final • Métodos final � Contenedores � Clase Class � Envoltura de tipo (autoboxing) • Clase Number y subclases � Sobrecarga de métodos � Variables de clase • Inicializador static _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 21 Clases parametrizadas class Box <T> { private T obj; public void add(T obj){ this.obj = obj; } public T get() { return this.obj; } } public class Ejemplo { public static void main(String[] args) { Box<String> p = new Box(); p.add(new String("Hola")); String s = p.get(); System.out.println(s); } } E elemento (colecciones Java) K clave N número T tipo S, U, etc. (otros tipos) V valor Especificación de clase genérica (parámetro) No requiere ‘cast’ Sólo se pueden agregar objetos String _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 22 � Clases que operan con cualquier tipo de dato, donde el tipo: � No se indica hasta que se instancie la clase � Es un parámetro de tipo formal � No puede ser primitivo � Principal utilidad en el uso de colecciones � Se aplican reglas estáticas de verificación de tipos � No es necesario usar “cast” � Restricciones � No se pueden crear instancias de parámetros de tipos genéricos � Un miembro estático no puede usar parámetros de tipos genéricos declarados externamente � Se pueden parametrizar los métodos estáticos � No pueden heredar de Throwable Generalidades: Clases parametrizadas _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 23 Cualquier tipo T que herede de A y de B public class Divisor<T extends A & B> { … } Los tipos T1 y T2 heredan de Number public class Sumador<T1 extends Number, T2 extends Number> { public T1 imprimir(T2 objeto) { ... } } Método parametrizado public <T extends Comparable> void imprimir(T objeto) { ... } Creación de una instancia de tipo genérico T otro = (T)obj.getClass().newInstance(); Uso de clases parametrizadas _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 24 class Box <T extends Number> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } public <U extends Comparable> void mostrar (U obj) { System.out.println("T:"+obj.getClass().getName()); } } Box<Integer> obj = new Box(); obj.add(new Integer(10)); obj.mostrar(obj); obj.add(new Float(23.56)); obj.mostrar(obj.toString()); Clases y métodos parametrizados Error: Box no es subclase de Comparable Object Number Float Integer … Character _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________ Diapositiva 25 Clases parametrizadas acotadas � Acotadas class Impresor <T extends Number> { private T obj; public Impresor(T obj) { this.obj = obj; } public void setObjeto(T obj) { this.obj = obj;} public T getObjeto() { return obj; } public void imprimir() { System.out.println(obj.toString()); } } public class Ejemplo { public static void main(String[] args) { Impresor<String> cadena; Impresor<Integer> entero = new Impresor(780); entero.imprimir(); } } Impone restricción T sólo puede ser de clases derivadas de Number Error: String no es subclase de Number _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 26 Métodos parametrizados class Comparadora { public <K, V> boolean compare(Autos<K, V> a, Autos<K, V> b){ return a.valor.equals(b.valor) && a.marca.equals(b.marca); } } class Autos<K, V> { public final K valor; public final V marca; public Autos(K v, V m) { valor = v; marca = m; } } … Autos<Integer, String> p1, p2; p1 = new Autos<Integer, String>(10000, "Fiat"); p2 = new Autos<Integer, String>(20000, "Ford"); boolean iguales = new Comparadora().compare(p1, p2); Se asocia a K Se asocia a V _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 27 Parametrización con comodines � <? extends xClase> � Establece un límite superior � cualquier clase que sea subclase xClase � para la semántica «in» de datos en métodos � <? super xClase> � Establece un límite inferior � cualquier clase que sea super de xClase � para la semántica «out» de datos en métodos Indicar las restricciones para los tipos con los que se puede parametrizar una clase _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 28 Ejemplos de parametrización <T extends Object & Comparable<? super T>> objetos de una clase T que sea subclase de Object y que implemente Comparable para objetos cuya superclase sea T (incluído T) static <T extends Comparable<? super T>> void sort(List<T> list) Por ejemplo: List acepta objetos Estudiante que implementan Comparable<Persona> si Estudiante es subclase de Persona static <T extends Comparable<T>> void sort(List<T> list) Por ejemplo: List acepta sólo objetos que implementan Comparable<Persona> _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 29 Parametrización: uso de extends y super class Aplica { public void algo(D <? super B> x){...} public void otro(){ algo(new D<A>()); algo(new D<B>()); algo(new D<C>()); } } class Aplica { public void algo(D <? extends B> x){...} public void otro(){ algo(new D<A>()); algo(new D<B>()); algo(new D<C>()); } } class A{ } class B extends A{ } class C extends B{ } class D<T>{ } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 30 � Clase interna definida en un bloque de código � Por ejemplo dentro de un método � Sólo visibles y usables dentro del bloque � No pueden � Incluir un modificador de acceso � Ser estáticas � Utilidad � Claridad de código, evita el exceso de clases pequeñas � Encapsulamiento y ocultamiento en paquetes � Agrupamiento de clases relacionadas � Proximidad entre la definición y el uso de las clases � Aplicación � Tratamiento de eventos � Creación de clases de ayuda o adaptación Clases anidadas: locales _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 31 class VectorInverso extends Vector { class Iterador implements Enumeration { private VectorInverso contenedor; public Iterador(VectorInverso v){ contenedor = v; } public Object nextElement() { return contenedor.get(indice--); } public boolean hasMoreElements() { return indice >= 0; } } private int indice; public Enumeration elements() { indice = elementCount - 1; return new Iterador(this); } } public class Main { public static void main(String[] args) { VectorInverso v = new VectorInverso(); for (int i = 0; i < 10; i++) v.addElement(new Long(i)); Enumeration e = v.elements(); while (e.hasMoreElements()) System.out.println(e.nextElement()); } } Clases anidadas c re a o b je to It e ra d o r return new ListIterator(){ private int indice = 0; public void add(Object o) {} public boolean hasNext() {return true;} public boolean hasPrevious() {return true;} public Object next() { return indice == size() ? get(indice = 0) : get public int nextIndex() {return indice == size() - 1 ? 0 : indice + 1;} public Object previous() {return null;} public int previousIndex() {return indice == 0 ? size() - 1 : indice - public void remove() {} public void set(Object o) {} }; } } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 32 � Clase interna definida como miembro (no static) de otra clase � Pueden declararse como privadas o protegidas � Esto no impide su acceso desde la clase contenedora � Cada instancia de una clase miembro se asocia internamente a una instancia de la clase contenedora � Tiene acceso completo y directo a la clase externa � Incluidos miembros private � No puede tener miembros estáticos � No pueden tener nombres comunes con la clase externa � No es posible crear un objeto de la clase interna sin tener un objeto de la clase contenedora Clases miembro _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 33 � Clase interna local sin nombre � Se define e instancia en una sola operación � Sólo puede existir una instancia � Puede ser incluida en una expresión � Utilidad � Adaptadores de clase (patrones) � Añadir comportamiento a objetos que ya tienen nombre � Escritura de pequeños “callbacks” encapsulados (enumeradores, iteradores, …) Clases anónimas _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 34 class VectorInverso extends Vector { private int indice; public Enumeration elements() { indice = elementCount - 1; return new Enumeration() { public Object nextElement() { return elementData[indice--]; } public boolean hasMoreElements() { return indice >= 0; } }; } } public class MyVector { public static void main(String args[ ]) { VectorInverso v = new VectorInverso(); for (int i = 0; i < 10; i++) v.addElement(new Long(i)); Enumeration e = v.elements(); while (e.hasMoreElements()) System.out.println(e.nextElement()); } } Clases anónimas _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 35 � Clases o interfaces estáticas anidadas dentro de otra clase � Deben calificarse static � Sólo se pueden anidar dentro de clases normales o de clases internas de alto nivel � No es necesario un objeto de la clase externa para crear un objeto de la clase interna estática � Modo de referenciarlas � NombreClaseExterna.NombreClaseInterna � Desde la clase estática interna sólo se pueden acceder a los miembros estáticos de la clase externa � Al compilar el .class se genera � NombreClaseExterna$NombreClaseInterna Clases e interfaces de alto nivel _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 36 Interfaces de alto nivel class Pila<T> { public T cbza() { throw new IllegalStateException(); } public Pila<? extends Number> cola() { throw new IllegalStateException(); } public void sacar( Pila<T> list ) { throw new IllegalStateException(); } public static <T> Pila<T> poner( Pila<? extends Number> list, T nuevaCbza ) { return new ListBody<T>( nuevaCbza, list ); } public String contenido( Pila<? extends Number> list ) { return list.esVacia() ? "" : " > " + list.cbza() + contenido( list.cola() ); } public boolean esVacia() { return true; } private static class ListBody<T> extends Pila<T> { ... } } Clases static Refinamiento de métodos y comportamiento polimórfico Parametrización de clases Método finalize() Anotaciones _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 37 Interfaces de alto nivel private static class ListBody<T> extends Pila<T> T cbza; Pila<? extends Number> cola; ListBody( T cab, Pila<? extends Number> col ) { cbza = cab; cola = col; } @Override public void sacar( Pila<T> list ) { if (!list.esVacia() && !list.cola().esVacia()){ cbza = (T)list.cola().cbza(); cola = list.cola().cola(); } else try { this.finalize(); } catch (Throwable e) {} } @Override public T cbza() { return cbza; } @Override public Pila<? extends Number> cola(){ return cola; } @Override public boolean esVacia() { return false; } } public class claseStatic { public static void main(String[] a){ Pila<Integer> obj; obj = new Pila<Integer>(); int v[] = {34,67,89,12,45,67,23}; obj.sacar(obj); for (int e : v) obj = Pila.poner(obj, e); System.out.println( obj.contenido(obj) ); obj.sacar(obj); System.out.println( obj.contenido(obj) ); } } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 38 � Referencia al objeto de la clase contenedora � Creación de un objeto de una clase interna � Herencia de una clase interna: constructor de la clase Sintaxis de this, new y super class A { class B { private A obj; public void metodo1() { obj = A.this; } } } class A { class B { } } class C { private A.B obj; public void metodo1() { obj = (new A()).new B(); } } class A { class B { } } class C extends A.B { public C() { (new A()).super(); } } _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 39 Threads Creado Muerto Dormido InterrumpidoEsperando Bloqueado listo Ejecución wait interrupt interrupted sleep solicitud I/O completó I/O start notify expiró intervalo d e s p a c h a d o d e s a lo ja d o Proceso A Hilo Memoria Proceso B Hilo Memoria … Proceso C Hilo1 Memoria Hilon … Threads Programación concurrente Clase Thread interface Runnable estados de un thread prioridades métodos syncronized _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 40 Visiones del Paradigma Orientado a Objetos � Creación de paradigma nuevo � Simulación del mundo real � Manejo de la complejidad � Clases y objetos � Métodos y mensajes � Herencia � Polimorfismo � Evolución de paradigma existente � Aumento tamaño de programas => aumenta complejidad � La complejidad = interconexión de partes � Manejo de la complejidad � Procedimientos � Módulos � Tipos de datos abstractos + herencia _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 41 Caso: Control UnidadDeControl temperatura : int humedad : int resultados : String calcAjuste() run() estado() setParametros() crearLocal() ConsolaDeCtrl corriendo : boolean = false ConsolaDeCtrl() initComponents() clickFijar() clickMostrar()clickCrear() cambioTemp() cambioHmdad() main() +udadCtrl 11 Acondicionador consumo : int = 1000 regular() getConsumo() (from Local) Contenedor listIterator() 1 +ambientes 1 ErrorHardware obj : Local.Censor tipo : char ErrorHardware() lecturaNula() (from Local) Local volumen : int Local() 1 +equipoAA 1 1..n1..n Censor tempActual : int hdadActual : int inputTemperatura() inputHumedad() getMedicion() run() (from Local) 1 -obj 1 1 +censor 1 �Threads �Métodos nativos �Contenedores �Iteradores �Excepciones _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 42 Paradigma Orientado a Objetos � Necesidades � Abordar problemas más complejos � Reducir la complejidad de mantenimiento � Análisis O.O. � Modelo conceptual � Requerimientos del sistema � Diseño O.O. � Diseño lógico � Diseño físico � Programación O.O � Codificación � Prueba Modelos, casos de uso, etc. Diagramas, patrones, etc. Java, C#, etc. _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 43 Modelar la realidad Secretaria Fábrica Gerente Auto depende empleado produce empleado Persona -sueldo Gerente +decidir() Secretaria -horario +redactar() Fábrica -capacidad +producir() Auto -longitud +acelerar() depende empleado produce abstract class Persona { private Fabrica trabaja protected int sueldo } class gerente extends Persona { public void decidir() } class secretaria extends Persona { private Gerente depende private int horario public void redactar() } class Fabrica { private int capacidad public Auto construir() } class auto { private int longitud public void acelerar() } Los “objetos” del mundo real tienen características, comportamientos y relaciones entre ellos El modelado O.O. “mapea” esa realidad, lo más fielmente posible, a fin de reducir “la distancia“ entre ambas El paradigma de P.O.O. facilita el hacer una implementación “más cercana” a la situación real sueldo decide sueldo horario redacta memos capacidad construye longitud se mueve _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 44 Características de la POO � Abstracción �de conceptos del mundo real � Naturalidad �en la representación del modelo del mundo real � Encapsulamiento � implementación oculta accediendo sólo a la interface � Modularidad �subdivisión de la estructura de la aplicación � Independencia funcional �modificaciones en el código no impactan en el resto � Reusabilidad del código �ampliar comportamientos sin modificar lo existente _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________
Compartir