Programacion-avanzada-teoria

Embed Size (px)

Citation preview

Tema0. Introduccin a JavaParadigmas de programacinProgramacin orientada a objetosEl lenguaje JavaCaractersticas de JavaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 2/14Paradigmas de programacin Dos paradigmas de programacin: Modelo orientado a procesos: los programas son una serie de pasos lineales (ej. C) Qu est pasando? Cdigo actuando sobre datos Programacin orientada a objetos: organiza unprograma alrededor de sus datos (objetos) y un conjunto de interfaces bien definidas Quin est siendo afectado? Datos controlando el acceso al cdigoProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 3/14Programacin orientada a objetos Aparece a finales de los 60, pero es a principios de los 80 cuando con el lenguaje Smalltalkcomienza un inters claro hacia este paradigma. La programacin orientada a objetos es el paradigma de programacin y anlisis y diseo de aplicaciones claramente dominante en la actualidad. Hoy prcticamente no se concibe un lenguaje de programacin sin caractersticas de orientacin a objetos: Eiffel, C++, Java, C#, etc.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 4/14Programacin orientada a objetos Las ventajas del paradigma OO son mltiples: Es intuitiva, describe un problema en trminos similares a los que utiliza la mente humana. Permite construir soluciones ms seguras y con un mantenimiento ms sencillo. Fomenta la reutilizacin y el trabajo en equipo. Escalabilidad de las aplicaciones. Las caractersticas principales del paradigma OO: Incorpora los conceptos de abstraccin y encapsulacinheredados de los tipos de datos abstractos. Incorpora mecanismos especficos y extremadamente poderosos como son la herencia y el polimorfismo. Admite de manera muy natural en algunos lenguajes el soporte de genericidad (patrones) y la definicin de operadores. Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 5/14Conceptos bsicos de la POO Clase Define las caractersticas abstractas de una cosa Lo que le caracteriza (atributos) Las cosas que puede hacer (mtodos) Objeto Una instancia particular de una clase Los valores de sus atributos conforman su estado Mtodos Las habilidades asociadas a un objeto Paso de mensajes Para enviar datos a otro objeto o invocar un mtodoProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 6/14Programacinorientada a objetos El desarrollo siguiendo el enfoque orientado a objetos es un proceso integral que incluye mtodos especficos de anlisis y diseo, notacin grfica (UML) y lenguajes de programacin orientados a objetos Las soluciones obtenidas durante la fase de anlisis y diseo no son especficas para ningn lenguaje de POO.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 7/14El lenguaje Java Desarrollado en los laboratorios de Sun, es uno de los lenguajes de programacin orientado a objetos que mayor repercusin ha tenido en los ltimos aos Basado en C++ pero simplificado, mucho ms fcil deusar, de ms alto nivel y menos propenso a errores Amplsima biblioteca estndar de clases predefinidas Las aplicaciones Java pueden ser ejecutadas encualquier plataforma sin necesidad de recompilacin Gestin avanzada de memoria mediante un recolector de basura Gestin avanzada de errores, tanto en tiempo de compilacin como de ejecucin Lenguaje abierto. Existen kits de desarrollo y numerosa documentacin gratuitos en la redProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 8/14Introduccin histrica GREEN Patrick Naughton y James Gosling, Sun Microsystems, 1991 Pequeo lenguaje para receptores de TV por cable. Cdigo ligero. Multiplataforma. OAK Propuesta anterior de N. Wirth: USCD Pascal. La portabilidad del cdigo se consigue conbytecodes y una mquina virtual. Experiencia previa de los diseadores en C++.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 9/14Introduccin histrica *7 Fracaso de un controlador remoto en 1992. First Person Inc 1993 y primera mitad de 1994. Fracasoempresarial. Explosin de Internet: el navegador. Mosaic & Netscape (J. Clark yM. Andreessen).Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 10/14Introduccin histrica Java Navegador construido en Java: HotJava (Naughton y Payne, 1995) Finales de 1995 Netscape 2.0 incluye soporte para Java. Sun desarrolla lanza Java a principios de 1996. IBM, Symantec, etc. tambin incluyen el soporte a Java. Microsoft tambin soporta Java. En 1998 Sun lanza Java 2.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 11/14Caractersticas de Java Orientado a objeto Simple Distribuido Robusto Seguro Multiplataforma Portable Interpretado Multihilo DinmicoCompilacin, bytecode y JVM Java sigue un esquema no tradicional de compilacin/ejecucin La compilacin genera un ejecutable en bytecode o cdigo intermedio independiente Para su ejecucin se requiere un JRE especfico de la plataformaformado por una mquina virtual java (JVM) y las libreras de clases. La JVM interpreta el bytecode o realiza su compilacin just-in-time para que su ejecucin sea ms eficienteProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 13/14Compilacin, bytecode y JVM Ventajas de este sistema: Se compila la aplicacin una nica vez y los ejecutables en bytecode obtenidos son vlidos para cualquier plataforma. El cdigo fuente queda a salvo. Es muy robusto. La mquina virtual Java es capaz de detectar y notificar gran cantidad de errores durante la ejecucin de la aplicacin (como accesos a elementos fuera de un vector). El recolector de basura no ocupa espacio en el ejecutable, ya que viene integrado en la JVM. Los ejecutables son pequeos porque las libreras de clases vienen proporcionadas junto a la JVM en el JRE de la plataforma concreta. Inconvenientes: Velocidad. Evidentemente la interpretacin o incluso compilacin just-in-time del bytecode produce aplicaciones ms lentas que la ejecucin directa de un binario. El recolector de basura puede suponer una sobrecarga adicional a la CPU. La generalidad tiene como inconveniente que no se aprovecha totalmente la potencia de la mquina y del sistema operativo.Java vs otros lenguajes OOJava C# C++ Eiffel SmalltalkAo aparicin 1995 2000 1985 1985 1970Sintaxis Ins. C++ Ins. Java Ins. C Ins. Pascal OriginalDifusin Amplia Amplia Amplia Limitada LimitadaLibrera de clases Muy amplia Muy amplia Escasa Amplia AmpliaRecolector basura S S No SSManejo objetos Dinmico Dinmico Est./Din. Est./Din. DinmicoTipo ejecutable Bytecode IL Code Binario Binario BytecodesEjecucin Mediante JVM Mediante CLR Directa Directa Mediante SVMVelocidad ejecutable Media Media Muy alta Alta BajaSoporte excepciones S S S S SHerencia mltiple No No S S NoSoporte operadores Muy limitado Limitado S S NoSoporte plantillas No No S S NoTema1. El entorno de programacin JavaDistribuciones y desarrollo JavaFuncionamiento de JavaEl entorno de programacinEstructuras fundamentales en JavaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 2Distribuciones de Java Existen distintas ediciones de Java para el desarrollo de aplicaciones en distintos mbitos: Aplicaciones de propsito general (J2SE) Aplicaciones de gestin en entornos empresariales (J2EE) Aplicaciones para telfonos mviles, PDAs y otros dispositivos electrnicos que permitan aplicaciones empotradas (J2ME)Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 3Distribuciones de Java La ms utilizada es sin duda la edicin estndar (J2SE). Los ejemplos de cdigo Java que veremos a lo largo de los siguientes temas pertenecen a esta edicin.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 4Distribuciones de Java Existen dos kits diferentes descargables de la pgina de Sun: Java Development Kit (JDK) permite desarrollar y ejecutar aplicaciones Java Runtime Environment (JRE) permite nicamente la ejecucin J2SE incluye bibliotecas muy extensas y completas, que permiten la implementacin de casi cualquier tipo de aplicacin: Seguridad EEDDs Componentes (JavaBeans) Internacionalizacin Entrada/Salida XML Redes y acceso a Internet Programacin distribuida (RMI) Matemtica de precisin arbitraria Sonido Interfaz de usuario (AWT, Swing) Grficos 2D Manipulacin, carga y descargade imgenes Impresin Acceso a bases de datos (JDBC) Gestin de preferencias y configuracionesProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 5Entornos de desarrollo Java JDKEl kit de desarrollo bsico proporcionado por Sun. Es lo mnimo que se necesita para desarrollar. til si se necesita compilar aplicaciones Java de manera espordica o en general para programadores con espiritu espartano. Puede bajarse gratuitamente para cualquier plataforma de java.sun.com. NetBeansEntorno integrado de desarrollo Java de Sun, realizado ntegramente en Java (y por tanto multiplataforma). Consume bastantes recursos. Permite disear ventanas, escribir cdigo, compilar, ejecutar etc. Puede obtenerse gratis en www.netbeans.org.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 6Entornos de desarrollo Java Borland JbuilderExcelente entorno integrado de desarrollo Java de Borland. Al igual que Netbeans, tambin est realizado ntegramente en Java. Existen versiones limitadas que pueden bajarse de www.borland.com Microsoft Visual J++Uno de los ms populares, aunque las aplicaciones obtenidas pueden presentar problemas de compatibilidad con el SDK oficial de Java, por el uso de libreras especificas de Microsoft. Otros: Eclipse, IBM WebSphere, Oracle JDeveloper, etc.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 7Funcionamiento de JavaProgramacin CompiladorIntrprete EjecucinmyProgram.javacdigo fuentebytecodemyProgram.classProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 8Funcionamiento de Java Cdigo fuente Secuencia de instrucciones que forma el programa y que puede ser escrita con cualquier editor. Bytecode Dialecto de ms bajo nivel que el cdigo fuente, es decir, ms cercano a las instrucciones mquina. Se obtiene al compilar el cdigo fuente y no es directamente ejecutable. Para ser ejecutado precisa la Java VM. Mquina Virtual (MV) Hace posible que el bytecode, que no es cdigo maquina especfico para ninguna mquina, se ejecute en cualquier plataforma para la que exista una MV.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 9Comandos bsicosComando Funcinjavac Es el compilador de Java, convierte programas escritos en Java a bytecodes.java Es el intrprete de Java, permite ejecutar los bytecodes.javadoc Genera la documentacin API en formato HTML a partir del cdigo fuente Java.jdb Debugger de Java.javap Desensambla archivos Java (bytecodes).javahCrea las cabeceras y estructuras en C correspondientes a una clase Java. Esto permite la invocacin de mtodos nativos (en C o C++) desde programas escritos en Java.appletviewer Permite ejecutar applets sin necesidad de emplear un navegador web.Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 10Lenguaje Java/* myProgram.java */class myProgram {public static void main(String args[]) {int num; // Declaracin de variable de tipo enteronum = 100; // asignacin a num del valor 100System.out.println(Esto es num: + num);num = num * 2;System.out.println(El doble de num es: + num);}}ProgramacinmyProgram.javacdigo fuenteProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 11Lenguaje JavaCompiladorjavac javac myProgram.javaOpcin Significado-classpath busca las clases necesarias en los directorios mencionados-verboseda informacin de todo lo que hace el compilador-d pone el resultado de la compilacin (el fichero .class) en el directorio indicadoProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 12Lenguaje JavaJava bytecodemyProgram.classCompiladorSe obtieneMVMacMV WindowsMacOS WindowsMVLinuxLinuxMVSolarisSolarisHWJavaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 13Lenguaje JavaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 14Lenguaje JavaIntrpretejava java myProgramOpcin Significado-classpath busca las clases necesarias en los directorios mencionados-verboseda informacin de todo lo que hace el intrprete-versionindica el nmero de versin del intrpreteProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 15Lenguaje Java Alternativa para mayor velocidad de ejecucin Interpretacin de bytecodes es lenta Esquema de compilacin dinmica just-in-timeIntrpreteProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 16Lenguaje JavaEjecucinProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 17 Texto que no aparece en el programa ejecutable Comentario de lnea Comentarios largosComentariosSystem.out.println(We will not use Hello world!);// is this too cute?/* This is the first sample program in Core JavaCopyright 1998 Cay Horstmann and Gary Cornell*/public class FirstClass {public static void main (String[] args) {System.out.println(Hello world!);}}Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 18Tipos de datos Java es un lenguaje fuertemente tipadoint 4 bytes -2.147.483.648 a 2.147.483.647short 2 bytes -32.768 a 32.767long 8 bytes -9.223.372.036.854.775.808L a 9.223.372.036.854.775.807Lbyte 1 byte -128 a 127double 8 bytes 1.79769313486231570E+308float 4 bytes 3.40282347E+38Fchar 2 bytes 0 a 65.535boolean 1 bit true o falseEnterosComaflotanteCaracteresBooleanoProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 19Variables Son la unidad bsica de almacenamientoint numEntero; // nmero enterodouble numDoble; // nmero de doble precisinboolean listo = true; // variable booleanachar letra; // variable de tipo carcterint a, b; // dos variables de tipo enteroint foo; // esto es una declaracinfoo = 37; // esto es una asignacinfoo = foo + 2; // tambin es una asignacinint i = 10; // esto es una inicializacinint j = 2 * i; // esto es una inicializacin dinmicaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 20Conversin de tipos Promocin de variables Se pueden asignar sin un cast explcito Truncado Posible prdida de informacinbyte short int long float doublechar intbyte b;int i,double d = 257.351;i = (int) d; //i = 257b = (byte) i; //b = 1double x = 9.997;int nx = (int) x;double x = 9.997;int nx = (int)Math.round(x);Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 21Constantes Se utiliza la palabra reservada final Slo se puede asignar la variable una vez Su valor se establece para siempre y no se modifica Se suelen nombrar en maysculaspublic class UsesConstants {public static void main (String[] args) {final double CM_PER_INCH = 2.54;double paperWidth = 8.5;double paperHeight = 11;System.out.println(Paper size in centimeter: + paperWidth * CM_PER_INCH + by + paperHeight * CM_PER_INCH);}}Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 22Bloques y alcances Un bloque de sentencias es un conjunto de sentencias simples de Java entre dos corchetes Los bloques definen el alcance de las variables No pueden declararse variables con el mismo nombre dentro de un mismo bloque{int n;. . .{int k;. . .}// k variable local del bloque// y definida nicamente // hasta el final del bloque}{int n;. . .{int k;int n;. . .}// error no se puede redefinir// n en el bloque inferior}Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 23Operadores aritmticos Operadores aritmticos usualesint i = n + 2; // sumaint a = 2 * i; // productoint b = a - 17; // restaint c = n / 2; // divisinint d = n % 2; // mduloint m = 7;int n = 7;a = 2 * ++m; //a igual a 16a = 2 * m++; //a igual a 14-- Decremento++ Incremento% Mdulo/ Divisin* Producto- Resta+ Suma Operadores con asignacin En general cualquier operador antes del signo =x += 5; // esto esx = x + 5;// equivalentey *= 2; // esto esy = y * 2;// equivalenteOperadores a nivel de bits= Desplazamiento a derecha y asignacin^= XOR a nivel de bit y asignacin|= OR a nivel de bit y asignacin&= AND a nivel de bit y asignacin Desplazamiento a derecha rellenando con ceros>> Desplazamiento a derecha^ XOR a nivel de bit| OR a nivel de bit& AND a nivel de bit~ NOT a nivel de bitProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 25Operadores lgicosNOT unario lgico !AND lgico &OR lgico |XOR lgico ^AND en cortocircuito &&OR en cortocircuito | |AND y asignacin &=OR y asignacin |=XOR y asignacin ^=Igual a ==Distinto de !=Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 26Jerarqua de los operadoresOperador Asociacin()[].izquierda a derecha++-- ~!derecha a izquierda*/%izquierda a derecha+-izquierda a derecha>>>>izquierda a derecha=izquierda a derecha==!=izquierda a derecha&izquierda a derecha|izquierda a derecha&&izquierda a derecha||izquierda a derecha=(op)=derecha a izquierdaProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 27Sentencias condicionalesSeleccin IFif (print == true)System.out.println(A);if (yourSales >= target) {performance = OK;bonus = 100;}if (condicin) sentencia;if (condicin) { bloque }yourSalestargetperformance = OKbonus = 100NOSProg. Avanzada - ITIG Jos Ramn Jurez Rodrguez 28Sentencias condicionalesSeleccin IF-ELSEif (yourSales >= 2 * target) {performance = Excellent;bonus = 1000;}else if (yourSales >= 1.5 * target) {performance = Fine;bonus = 500;}else if (yourSales >= target) {performance = Satisfactory;bonus = 100;}else { fired = true;}if (condicin) sentencia1else sentencia2;if (condicin) { bloque1} else { bloque2};Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 29Bucles indeterminadosBucle DO-WHILEdo {//bloque sentencias} while (condicin);Bucle WHILEwhile (condicin) { //bloque sentencias} boolean seguir;int numero, cociente, resto;cociente=0;resto=numero;seguir = (numero > divisor);while (seguir) {cociente++;resto-=divisor;seguir = (numero > divisor);}boolean seguir;int numero, cociente, resto;cociente=0;resto=numero;seguir = (numero > divisor);do {cociente++;resto-=divisor;seguir = (numero > divisor);} while (seguir);Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 30Bucles determinadosBucle FORfor (inicializacin; condicin; iteracin) { //bloque de instrucciones...}int i;for (i = 1; i 0; i--) System.out.println(Counting down + i);System.out.println(Blast off!!);int factorial, numero;factorial = 1;for (i=numero; i>1; i--) factorial=factorial * i;Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 31Seleccin mltipleSeleccin SWITCHswitch (expresin) {case val_1: sentencias;break;.........case val_i: sentencias;break;.........default: sentencias;}switch (codigo) {case 10: a = 10;b = true;break;case 100: a = 50;b = false;break;case 200: a = 75;break; default: a =1;b = false;}Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 32Seleccin mltipleclass Ejemplo {public static void main( String args[] ){int mes = 8;String estacion;switch ( mes ) {case 12: // Continacase 1:// Continacase 2:estacion = "invierno";break;case 3:// Continacase 4:// Continacase 5:estacion = "primavera";break;case 6:// Continacase 7:// Continacase 8:estacion = "verano";break;case 9:// Continacase 10: // Continacase 11:estacion = "otoo";break;default:estacion = mes falso";}System.out.println( Agosto es + estacion + "." );}}Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 33Arraysint[] arrayOfInt;arrayOfInt = new int[100];double[] arrayOfDouble = new double[10];for (int i = 0; i < arrayOfInt.lenght); i++)arrayOfInt[i] = i;int[] luckyNumbers = smallPrimes;luckyNumbers[5] = 12;// ahora smallPrimes[5] tambin es 122 3 4 5 1 0arrayOfInt[i] smallPrimesluckyNumbers23571112Prog. Avanzada - ITIG Jos Ramn Jurez Rodrguez 34Matrices No son arrays multidimensionales sino arrays de arraysmatriz[i][j]3,22,21,20,2 0,3 0,1 0,03,3 3,1 3,02,3 2,1 2,01,3 1,1 1,0double[][] matriz;matriz = new double[4][4];for (int i = 0; i < matriz.length; i++)for (int j = 0; j < matriz[i].length; j++)matriz[i][j] = i + j;int[][] demo = { {1, 2}, {3, 4} };double[] temp = matriz[i];matriz[i] = matriz[i + 1];matriz[i + 1] = temp;Programacin OO enJavandiceTema 2: Programacin orientada aobjetos en JavaProgramacinAvanzada1 Clases de objetos2 Proteccin de miembros3 Proteccin de clases4 Inicializacin y finalizacin5 Creacin de objetos6 Trabajando con objetos7 Relaciones entre clases8 Clases anidadas e interiores9 Autoreferencias10 Aplicaciones orientadas a objetos11 Herencia en Java12 Adicin, redefinicin y anulacin13 Proteccin y herencia14 Herencia mltiple15 Polimorfismo16 Ligadura dinmica17 Informacin de clases en tiempode ejecucin18 Otros temas de inters en JavaProgramacin OO enJavaClases de objetosClases de objetosProgramacinAvanzadaLas clases de objetos son los elementos bsicosde la programacin orientada a objetos yrepresentan conceptos o entidades significativos deun problema determinado. Una clase viene descritapor dos tipos de elementos:Atributos (o variables de clase). Describen el estado interno de cada objetoOperaciones (o mtodos). Describen lo que se puede hacer con el objeto, losservicios que proporcionaAtributosOperacionesCuentanumero: Longtitular: Stringsaldo: FloatintersAnual: Realingreso (cantidad: Integer)reintegro (cantidad: Integer)ingresoInteresMes ()enRojos (): BooleanleerSaldo (): IntegerNombre dela claseProgramacin OO enJavaClases de objetosProgramacinAvanzadaUna clase de objetos describe las caractersticascomunes a un conjunto de objetos. Durante laejecucin de la aplicacin se producir lainstanciacin de esta clase, es decir, la creacin delos objetos que representan cada uno de losindividuos con sus caractersticas propias, es decir,valores especficos para sus atributosCuentanumero: Longtitular: Stringsaldo: FloatintersAnual: Realingreso (cantidad: Integer)reintegro (cantidad: Integer)ingresoInteresMes ()enRojos (): BooleanleerSaldo (): Integerc : Cuentanumero=123890023titular=Miguel Prezsaldo=1800.4intersAnual=0.25Clase de objetosObjetosd : Cuentanumero=23900839titular=Antonio Gmezsaldo=200intersAnual=0.25e : Cuentanumero=151590020titular=Javier Snchezsaldo=1200.2intersAnual=1.25Programacin OO enJavaClases de objetosProgramacinAvanzadaLa implementacin de esta clase en Java se realizara en un fichero con nombreCuenta.java, y su contenido sera el siguiente:class Cuenta {long numero;String titular;float saldo;float interesAnual;void ingreso (float cantidad) { }void reintegro (float cantidad) { }void ingresoInteresMes () { }boolean enRojos () { }float leerSaldo () { }}AtributosOperacionesLos atributos pueden ser de cualquiera de los tiposbsicos de Java: boolean, char, byte, short, int, long,float y double, referencias a otros objetos o arrays deelementos de alguno de los tipos citadosProgramacin OO enJavaClases de objetosProgramacinAvanzadaEn Java la implementacin de las operaciones serealiza en el interior de la definicin de la clase, justotras su declaracin:class Cuenta {long numero;String titular;float saldo;float interesAnual;void ingreso (float cantidad) {saldo += cantidad;}void reintegro (float cantidad) {saldo -= cantidad;}void ingresoInteresMes () {saldo += interesAnual * saldo / 1200;}boolean enRojos () {return saldo < 0; }float leerSaldo () { return saldo; }}Programacin OO enJavaClases de objetosProgramacinAvanzadaEl acceso a los atributos de la clase desde laimplementacin de las operaciones se realiza deforma directaLos atributos u operaciones estticas (static) sonaquellos que pertenecen a la clase en s, y no a losobjetosDe un atributo esttico no se genera una copia porcada objeto que se crea. Existe una nica copiacompartida por todos los objetos de la claseUna operacin esttica nicamente puede accedera miembros estticosProgramacin OO enJavaClases de objetosProgramacinAvanzadaclass Cuenta {long numero;String titular;float saldo;float interesAnual;// Contador de operacionesstatic int nOp = 0;static int leerNOperaciones () { return nOp; } // Operacin esttica auxiliar de conversinstatic long eurosAPesetas (float euros) { return euros * 166.386f; }void ingreso (float cantidad) { saldo += cantidad; ++nOp; }void reintegro (float cantidad) { saldo -= cantidad; ++nOp; }El atributo nOp mantiene una cuenta global del nmero de operacionesrealizadas en las cuentas del banco, para la realizacin de estadsticas. Laoperacin leerNOperaciones () permite leer este contadorLa operacin eurosAPesetas () es una operacin auxiliar de la clase Cuenta paraser usada cuando sea necesaria una conversin de monedaProgramacin OO enJavaProteccin demiembrosProgramacinAvanzadaEl principio de ocultacin de informacin se plasmaen los lenguajes OO en diversos mecanismos deproteccin de los miembros de la claseUML permite asociar tres niveles de proteccindiferentes a cada miembro de la clase:Miembros pblicos (+). Sin ningn tipo de proteccin especialMiembros privados (-). Inaccesibles desde el exterior de la claseMiembros protegidos (#). Similares a los privados aunque se permite suacceso desde las clases descendientes*Proteccin de miembros* Las veremos ms adelante, al estudiar el mecanismo de la herenciaClase-atributoPrivado: Tipo+atributoPublico: Tipo#atributoProtegido: Tipo-operacionPrivada ()+operacionPublica ()#operacionProtegida ()Programacin OO enJavaProteccin demiembrosProgramacinAvanzadaEn Java un miembro se etiqueta como pblico colo-cando el identificador public delante de su declaracinPara los miembros privados utilizaremos el identifica-dor privateclass Cuenta {private long numero;private String titular;private float saldo;private float interesAnual;public void ingreso (float cantidad) {saldo += cantidad;}public void reintegro (float cantidad) {saldo -= cantidad;}public void ingresoInteresMes () {saldo += interesAnual * saldo / 1200;}public boolean enRojos () {return saldo < 0; }public float leerSaldo () { return saldo; }}Cuenta-numero: Long-titular: String-saldo: Float-intersAnual: Real+ingreso (cantidad: Integer)+reintegro (cantidad: Integer)+ingresoInteresMes ()+enRojos (): Boolean+leerSaldo (): IntegerProgramacin OO enJavaProteccin demiembrosProgramacinAvanzadaLos miembros no etiquetados son accesibles porparte de clases amigas. En C++ y otros lenguajesOO las clases amigas a una dada pueden indicarseexplcitamenteEn Java se consideran amigas todas aquellas queforman parte del mismo paqueteUn fichero fuente java forma en s un paquete y por tanto todas las clasesincluidas en l son amigasLas clases incluidas en varios ficheros fuente pueden agruparse en un nicopaquete indicando el nombre de paquete al principio de cada fichero medianteel indicador packagepackage prueba;class A {...}class B {...}package prueba;class C {...}class D {...}class E {...}Las clases A, B y C son amigas al perteneceral mismo paquete pruebaLas clases D y E son amigas al pertenecer almismo fichero fuenteProgramacin OO enJavaProteccin demiembrosProgramacinAvanzadaEn este ejemplo, las clases Cuenta y Banco son amigas al pertenecer al mismofichero fuente. El acceso a los atributos de los objetos de la clase Cuentaalmacenados en el vector interno de Banco queda as garantizado. El atributosaldo puede mantenerse como privado puesto que existe una operacin quepermite obtener su valorclass Cuenta {long numero;String titular;private float saldo;float interesAnual;public void ingreso (float cantidad) {saldo += cantidad;}public void reintegro (float cantidad) {saldo -= cantidad;}public void ingresoInteresMes () {saldo += interesAnual * saldo / 1200;}public boolean enRojos () { return saldo < 0; }public float leerSaldo () { return saldo; }}class Banco {Cuenta[] c; // vector de cuentas...}Programacin OO enJavaProteccin demiembrosProgramacinAvanzadaAtencin: todas las clases que no se declaren comopertenecientes a ningn paquete de forma explcita,pertenecen a un paquete por defecto y por tantoson amigasUn paquete crea un espacio de nombres propios.Esto significa que la clase pasa a tener como prefijoel propio nombre del paquete. A la hora de utilizarlatenemos tres opciones:Utilizar su nombre completo: prueba.AImportar esa clase, para poder utilizarla sin el prefijo. Esto se indica al principiodel cdigo fuente mediante import prueba.AImportar directamente todas las clases del paquete, que se usaran sin prefijo:import prueba.*Programacin OO enJavaProteccin declasesProgramacinAvanzadaPor proteccin de clases entendemos un nivel superiorde la ocultacin de informacin, a nivel de clases. Esdecir, se trata de especificar que clases pueden serutilizadas y cuales no, y por quinDentro de un paquete, las clases son amigas y portanto no existen restricciones respecto a la utilizacinde una clase por las otrasSin embargo, desde el punto de vista del exterior,nicamente podrn ser utilizadas las clases pblicasdel paquete, es decir, aquellas con el identificadorpublic situado delante de su declaracinProteccin de clasesProgramacin OO enJavaProteccin declasesProgramacinAvanzadaAtencin: Java slo permite una clase pblica porfichero fuente, y el nombre de la clase y el ficherodeben coincidirEn nuestro ejemplo, si queremos que la clase Cuenta pueda ser utilizada desdeel exterior del fichero Cuenta.java deberemos declararla como pblicapublic class Cuenta {long numero;String titular;private float saldo;float interesAnual;public void ingreso (float cantidad) {saldo += cantidad;}public void reintegro (float cantidad) {saldo -= cantidad;}public void ingresoInteresMes () {saldo += interesAnual * saldo / 1200;}public boolean enRojos () { return saldo < 0; }public float leerSaldo () { return saldo; }}Programacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaLa iniciacin de los atributos de la clase se realizaen Java, al igual que en C++, mediante el uso deconstructores cuyo nombre coincide con el de laclaseInicializacin y finalizacinpublic class Cuenta {long numero;String titular;private float saldo;float interesAnual;Cuenta (long aNumero, String aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;}public void ingreso (float cantidad) {saldo += cantidad;}// Resto de operaciones de la clase Cuenta a partir de aquProgramacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaJava permite la sobrecarga de operaciones, por tantose pueden definir varios constructores posible para unaclase siempre que se diferencien en la lista deargumentos// Importar todas las clases del paquete java.ioimport java.io.*;public class Cuenta {long numero;String titular;private float saldo;float interesAnual;// Constructor generalCuenta (long aNumero, String aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;}Programacin OO enJavaInicializacin yfinalizacinProgramacinAvanzada// Constructor para obtener los datos de la cuenta de un ficheroCuenta (long aNumero) throws FileNotFoundException, IOException, ClassNotFoundException {FileInputStream fis = new FileInputStream (aNumero + .cnt);ObjectInputStream ois = new ObjectInputStream (fis);numero = aNumero;titular = (String) ois.readObject ();saldo = ois.readFloat ();interesAnual = ois.readFloat ();ois.close ();}public void ingreso (float cantidad) {saldo += cantidad;}public void reintegro (float cantidad) {saldo -= cantidad;}public void ingresoInteresMes () {saldo += interesAnual * saldo / 1200;}public boolean enRojos () { return saldo < 0; }public float leerSaldo () { return saldo; }}Nota: vase el apartado I/O: Reading and Writing del tutorial Java de Sun como apoyo para entenderel cdigo del nuevo constructorProgramacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaSi no se proporciona ningn constructor, Javaproporciona automticamente un constructor pordefecto, que no recibe argumentos y realiza unainicializacin por defecto de los atributosUna vez implementado un constructor propio por partedel programador, Java elimina dicho constructor,aunque puede ser definido nuevamente de maneraexplcitaCuenta () {numero = 00000000;titular = ninguno;saldo = 0;interesAnual = 0;}Programacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaNaturalmente los constructores pueden ser marcadoscomo pblicos, privados, protegidos o con acceso anivel de paquete, lo que especificar quien puede crearobjetos de esta clase y de que manera// Constructor generalpublic Cuenta (long aNumero, String aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;}// Constructor para obtener los datos de la cuenta de un ficheropublic Cuenta (long aNumero) throws FileNotFoundException, IOException, ClassNotFoundException {FileInputStream fis = new FileInputStream (aNumero + .cnt);ObjectInputStream ois = new ObjectInputStream (fis);numero = aNumero;titular = (String) ois.readObject ();saldo = ois.readFloat ();interesAnual = ois.readFloat ();ois.close ();}Programacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaCuando finaliza el uso de un objeto, es frecuente larealizacin de ciertas tareas antes de su destruccin,principalmente la liberacin de la memoria solicitadadurante su ejecucin. Esto se realiza en C++ y otroslenguajes OO en los denominados destructoresEstos destructores son operaciones invocadasautomticamente justo antes de la destruccin delobjetoSin embargo, en Java la liberacin de memoria serealiza de manera automtica por parte del recolectorde basura, por tanto la necesidad de este tipo deoperaciones no existe en la mayor parte de los casosProgramacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaSin embargo s puede ser necesario realizar algunatarea no relacionada con la liberacin de memoriaantes de la destruccin del objeto, como por ejemplosalvar el estado de la clase en un fichero o base dedatosJava permite introducir cdigo para este finimplementando una operacin pblica especialdenominada finalize. Esta operacin es invocadaautomticamente antes de la destruccin del objeto porparte del recolector de basuraProgramacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaSiguiendo nuestro ejemplo, vamos asegurarnos de que el estado de una cuentaqueda salvado en disco antes de su destruccin, para poder ser recuperadaposteriormente. Para ello introducimos el cdigo de escritura en fichero en laoperacin finalize de la clase Cuentapublic void finalize () : throws FileNotFoundException, IOException {FileOutputStream fos = new FileOutputStream (numero + .cnt);ObjectOutputStream oos = new ObjectOutputStream (fos);oos.writeObject (titular);oos.writeFloat (saldo);oos.writeFloat (interesAnual);oos.close ();}Programacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaSin embargo no sabemos en que momento serllamada dicha operacin, puesto que el recolector debasura puede decidir su eliminacin en un momentoindeterminado, e incluso no ser eliminado hasta elfinal de la ejecucin de la aplicacinUna posible solucin, aunque no muy recomendable,es ordenar al recolector de basura que realice unalimpieza de memoria inmediata, para asegurar lafinalizacin de los objetos. Esto se realiza medianteRuntime.getRuntime ().gc ()Se recomienda crear en su lugar una operacinordinaria con este mismo propsito, que sea invocadacuando haya finalizado el uso del objetoProgramacin OO enJavaInicializacin yfinalizacinProgramacinAvanzadaEn nuestro ejemplo introduciremos en la clase Cuenta una operacin pblica salvaren lugar de finalize, con la misma implementacin. Tras finalizar las operacionessobre la cuenta, invocaremos a salvar para guardar los cambios realizadospublic void salvar () : throws FileNotFoundException, IOException {FileOutputStream fos = new FileOutputStream (numero + .cnt);ObjectOutputStream oos = new ObjectOutputStream (fos);oos.writeObject (titular);oos.writeFloat (saldo);oos.writeFloat (interesAnual);oos.close ();}Programacin OO enJavaCreacin de objetosProgramacinAvanzadaEn Java los objetos se crean nicamente de formadinmica, es decir, en el heap. Para ello se utiliza eloperador new, de manera similar a C++Los objetos en Java se utilizan siempre a travs dereferencias. Las referencias son similares a lospunteros de C/C++, aunque su uso es mucho mssencilloPor tanto los pasos a seguir en la creacin de unobjeto son:Declarar una referencia a la claseCrear un objeto mediante el operador new invocando al constructor adecuadoConectar el objeto con la referenciaCreacin de objetosProgramacin OO enJavaCreacin de objetosProgramacinAvanzadaLa creacin de un objeto de la clase Cuenta se realizara de la siguiente forma:Cuenta c; // Una referencia a un objeto de la clase Cuentac = new Cuenta (18400200, Pedro Jimnez, 0.1f);En cambio, los tipos bsicos (int, long, float, etc.) spueden ser creados directamente en la pila. Esto esposible porque Java no los implementa realmentecomo clases de objetos, por motivos de eficiencia ycomodidad, ya que su uso es muy frecuenteCuenta c;float in;long num;in = 0.1f;num = 18400200; c = new Cuenta (num, Pedro Jimnez, in);Programacin OO enJavaCreacin de objetosProgramacinAvanzadaLas cadenas de caracteres se implementan con unaclase (String). Sin embargo no suele ser necesaria sucreacin de manera explcita, ya que Java lo hace demanera automtica al asignar una cadena constante*String s; // Una referencia a un objeto de la clase String// Conexin de la referencia s con un objeto String // creado dinmicamente e inicializado con la constante Pedros = Pedro;// Sera equivalente a:// char[] cc = {'P', 'e', 'd', 'r', 'o'}// s = new String (cc);Los arrays tambin deben ser creados dinmicamentecon new como si fueran objetos* Vase el apartado Characters and Strings del tutorial de Java de Sun para ms informacinint[] v; // Una referencia a un vector de enterosv = new int[10] // Creacin de un vector de 10 enterosProgramacin OO enJavaCreacin de objetosProgramacinAvanzadaSi el array es de referencias a objetos, habr quecrear adems cada uno de los objetos referenciadospor separadoCuenta[] v; // Un vector de referencias a objetos de la clase Cuenta int c;v = new Cuenta [10] // Crear espacio para 10 referencias a cuentasfor (c = 0; c < 10; c++)v[c] = new Cuenta (18400200 + c, Cliente n. + c, 0.1f);La destruccin de los objetos se realiza de maneraautomtica cuando el recolector de basura detecta queel objeto no est siendo usado, es decir, no estconectado a ninguna referenciaCuenta c1 = new Cuenta (18400200, Cliente 1, 0.1f);Cuenta c2 = new Cuenta (18400201, Cliente 2, 0.1f);c1 = c2// El objeto asociado a la cuenta 18400200 ha quedado desconectado// y ser eliminado por el recolector de basuraProgramacin OO enJavaTrabajando conobjetosProgramacinAvanzadaTrabajar con un objeto Java es similar a C++,aunque las referencias permiten un uso mucho mssencilloTrabajando con objetosCuenta c1 = new Cuenta (18400200, Pedro Jimnez, 0.1f);Cuenta c2 = new Cuenta (18400201);c2.reintegro (1000);c1.ingreso (1000);if (c2.enRojos ())System.out.println (Atencin: cuenta 18400201 en nmeros rojos);Programacin OO enJavaTrabajando conobjetosProgramacinAvanzadaSystem.out.println (** Introduzca num. cuenta e importe a retirar);InputStreamReader isr = new InputStreamReader (System.in);StreamTokenizer stk = new StreamTokenizer (isr);try {stk.nextToken ();long nc = (long) stk.nval;stk.nextToken ();float mi = (float) stk.nval;}catch (IOException e) {System.out.println (Error leyendo datos de operacin);}Cuenta c;try {c = new Cuenta (nc);}catch (Exception e) {System.out.println (Imposible recuperar cuenta);return;}if (c.leerSaldo () < mi)System.out.println (Saldo insuficiente);elsec.reintegro (mi);c.salvar ();En este ejemplo se pide un nmero de cuenta al usuario y una cantidad a retirar.A continuacin se carga la cuenta solicitada y se realiza el reintegroProgramacin OO enJavaTrabajando conobjetosProgramacinAvanzadaNaturalmente el compilador producir un error antecualquier acceso ilegal a un miembro de la claseEl acceso a un miembro esttico se realiza utilizandoel nombre de la clase en lugar de un objetoCuenta c = new Cuenta (18400200, Cliente 1, 0.1f);c.ingreso (1000);int pts = Cuenta.eurosAPesetas (c.leerSaldo ());System.out.println (Saldo: + c.leerSaldo () + ( + pts + pesetas);Cuenta c = new Cuenta (18400200, Pedro Jimnez, 0.1f);c.saldo = 1000;Cuenta.java:XX: saldo has private accessc.saldo = 1000;^1 errorProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaUn conjunto de objetos aislados tiene escasacapacidad para resolver un problema. En unaaplicacin til los objetos colaboran e intercambianinformacin, mantienen distintos tipos de relacionesentre ellosA nivel de diseo, podemos distinguir entre 5 tiposde relaciones bsicas entre clases de objetos:dependencia, asociacin, agregacin, composicin yherencia*Relaciones entre clases* La veremos ms adelante, en un apartado especficoProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaLa dependencia es la relacin menos importante.Simplemente refleja que entre dos clases de objetosexiste una posible colaboracin temporal con algnpropsitoUna dependencia puede indicar la utilizacin de unobjeto de una clase como argumento de unaoperacin de otra o en su implementacinComo vimos anteriormente, la clase Cuenta requiere las clases FileOutputStreamy ObjectOutputStream de la librera de clases de Java para la implementacin de laoperacin salvarFileOutputStreamObjectOutputStreamCuentanumero: Longtitular: String-saldo: FloatintersAnual: Real+ingreso (cantidad: Integer)+reintegro (cantidad: Integer)+ingresoInteresMes ()+enRojos (): Boolean+leerSaldo (): Integer+salvar ()Programacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaEn cambio, la asociacin es la relacin msimportante y ms comn. Refleja una relacin entredos clases independientes que se mantiene durantela vida de los objetos de dichas clases o al menosdurante un tiempo prolongadoEn UML suele indicarse el nombre de la relacin, elsentido de dicha relacin y las cardinalidades en losdos extremosVamos a sustituir el atributo titular por una asociacin con una nueva claseCliente completattuar1Cuentanumero: Long-saldo: FloatintersAnual: Real+ingreso (cantidad: Integer)+reintegro (cantidad: Integer)+ingresoInteresMes ()+enRojos (): Boolean+leerSaldo (): Integer+leerTitular (): Cliente+salvar ()Clientenombre: Stringapellidos: Stringdireccin: Stringlocalidad: StringfNacimiento: Date+nombreCompleto (): String+direccionCompleta (): String*Programacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaUna asociacin se implementa en Java introducien-do referencias a objetos de la clase destino de larelacin como atributos de la clase origenSi la relacin tiene una cardinalidad superior a unoentonces ser necesario utilizar un array o unaestructura de datos dinmica del paquete java.utilcomo Vector o LinkedListNormalmente la conexin entre los objetos serealiza recibiendo la referencia de uno de ellos en elconstructor u otra operacin similar del otroProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadapublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;// Constructor generalpublic Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular; saldo = 0; interesAnual = aInteresAnual;}Cliente leerTitular () { return titular; }// Resto de operaciones de la clase Cuenta a partir de aqupublic class Cliente {String nombre, apellidos;String direccion, localidad;Date fNacimiento;Cliente (String aNombre, String aApellidos, String aDireccion, String aLocalidad, Date aFNacimiento) {nombre = aNombre; apellidos = aApellidos; direccion = aDireccion; localidad = aLocalidad;fNacimiento = aFNacimiento;}String nombreCompleto () { return nombre + + apellidos; }String direccionCompleta () { return direccion + , + localidad; }}Programacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaLa agregacin es un tipo especial de asociacindonde se aade el matiz semntico de que la clasede donde parte la relacin representa el todo y lasclases relacionadas las partes.Realmente Java y la mayora de lenguajes orien-tados a objetos no disponen de una implementacinespecial para este tipo de relaciones. Bsicamentese tratan como las asociaciones ordinariasPolgonoformado por2* SegmentoDepartamentodispone de1 *DespachoProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaLa composicin es un tipo de agregacin que aadeel matiz de que la clase todo controla la existenciade las clases parte. Es decir, normalmente la clasetodo crear al principio las clases parte y al finalse encargar de su destruccinSupongamos que aadimos un registro de movimientos a la clase Cuenta, deforma que quede constancia tras cada ingreso o reintegrottuar*1regstra*Cuentanumero: Longtitular: String-saldo: FloatintersAnual: Real+ingreso (cantidad: Integer)+reintegro (cantidad: Integer)+ingresoInteresMes ()+enRojos (): Boolean+leerSaldo (): Integer+leerTitular (): Cliente+salvar ()Clientenombre: Stringapellidos: Stringdireccin: Stringlocalidad: StringfNacimiento: Date+nombreCompleto (): String+direccionCompleta (): StringMovimientofecha: Datetipo: Charimporte: Realsaldo: RealProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaLas composiciones tienen una implementacinsimilar a las asociaciones, con la diferencia de que elobjeto principal realizar en algn momento laconstruccin de los objetos compuestosimport java.util.Dateclass Movimiento {Date fecha;char tipo;float importe;float saldo;public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) {fecha = aFecha; tipo = aTipo; importe = aImporte; saldo = aSaldo;}}Programacin OO enJavaRelaciones entreobjetosProgramacinAvanzadapublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;LinkedList movimientos; // Lista de movimientos// Constructor generalpublic Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList ();}// Nueva implementacin de ingreso y reintegropublic void ingreso (float cantidad) {movimientos.add (new Movimiento (new Date (), 'I', cantidad, saldo += cantidad));}public void reintegro (float cantidad) {movimientos.add (new Movimiento (new Date (), 'R', cantidad, saldo -= cantidad));}public void ingresoInteresMes () { ingreso (interesAnual * saldo / 1200); }// Resto de operaciones de la clase Cuenta a partir de aqu Nota: tambin sera necesario modificar el otro constructor y la operacin salvar para tener en cuenta la lista de movimientosa la hora de leer/escribir la informacin de la Cuenta en discoProgramacin OO enJavaClases anidadas einterioresProgramacinAvanzadaJava y algunos otros lenguajes OOP permiten ladefinicin de una clase de objetos dentro de otraEl sentido de esta posibilidad es empaquetar dentrode una clase aquellas otras clases que no tienenutilidad o entidad fuera del contexto de ellaAl igual que cualquier otro miembro de una clase,una clase anidada puede ser esttica y utilizar losniveles de proteccin public, private y protectedCuando la clase anidada no es esttica, sedenomina clase interiorClases anidadas e interioresProgramacin OO enJavaProgramacinAvanzadaimport java.util.Datepublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;LinkedList movimientos; // Lista de movimientosstatic private class Movimiento {Date fecha;char tipo;float importe;float saldo;public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) {fecha = aFecha; tipo = aTipo; importe = aImporte; saldo = aSaldo;}}// Constructor generalpublic Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList ();}// Resto de operaciones de la clase Cuenta a partir de aquDesde el punto de vista de la organizacin del cdigo, tendra mucho mssentido introducir la clase Movimiento en el interior de Cuenta. Al ser declaradacomo privada, se impedira su utilizacin desde el exteriorClases anidadas einterioresProgramacin OO enJavaClases anidadas einterioresProgramacinAvanzadaLas clases anidadas estticas no tienen una utilidadmayor que la de un mero organizador de cdigoEn cambio las clases interiores tienen caracters-ticas especialesPueden ser creadas nicamente dentro de la clase que las englobaTiene acceso completo y directo a todos los atributos y operaciones del objetoque realiza su creacinLos objetos de la clase interior quedan ligadospermanentemente al objeto concreto de la claseenglobante que realiz su creacinNo debe confundirse este elemento con la relacinde composicin, aunque en muchos casos podremosutilizar clases interiores para la implementacin deeste tipo de relacionesProgramacin OO enJavaProgramacinAvanzadaimport java.util.Datepublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;LinkedList movimientos; // Lista de movimientosprivate class Movimiento {Date fecha;char tipo;float importe;float saldoAct;public Movimiento (Date aFecha, char aTipo, float aImporte) {fecha = aFecha; tipo = aTipo; importe = aImporte; saldoAct = saldo; // Copamos el saldo actual}}// Constructor generalpublic Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList ();}Implementando la clase Movimiento como una clase interior es posible copiar elvalor del saldo actual de la cuenta que realiza el movimiento de manera directaClases anidadas einterioresProgramacin OO enJavaClases anidadas einterioresProgramacinAvanzada// Nueva implementacin de ingreso y reintegropublic void ingreso (float cantidad) {movimientos.add (new Movimiento (new Date (), 'I', cantidad, saldo));saldo += cantidad;}public void reintegro (float cantidad) {movimientos.add (new Movimiento (new Date (), 'R', cantidad, saldo));saldo -= cantidad;}public void ingresoInteresMes () { ingreso (interesAnual * saldo / 1200); }// Resto de operaciones de la clase Cuenta a partir de aqupublic boolean enRojos () { return saldo < 0; }public float leerSaldo () { return saldo; }}Implementando la clase Movimiento como una clase interior es posible copiar elvalor del saldo actual de la cuenta que realiza el movimiento de manera directaProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadaEn ocasiones es necesario obtener una referenciaen la implementacin de una operacin al propioobjeto sobre el que ha sido invocada la operacinEsta referencia se obtiene en C++ y Java medianteel operador thisCuando encontremos this en una expresin,podremos sustituirlo mentalmente por este objetoAunque no es necesario, podemos utilizar this parallamar desde la implementacin de una operacin aotra operacin del mismo objetoAutoreferenciasProgramacin OO enJavaProgramacinAvanzadaLa llamada a la operacin ingreso desde ingresoInteresMes puede realizarseutilizando this como referencia del objeto sobre el que se invoca la operacinpublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;public void ingresoInteresMes () { this.ingreso (interesAnual * saldo / 1200); }// Resto de las operaciones de la clase CuentaEn este ejemplo, el uso de this es realmente til. Nos permite implementar laoperacin transferirDesde llamando a una operacin transferirA, previamenteimplementadapublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;public void transferirA (Cuenta c, float cant) { reintegro (cant); c.ingreso (cant); }public void transferirDesde (Cuenta c, float cant) { c.transferir_a (this, cant);}// Resto de las operaciones de la clase CuentaRelaciones entreobjetosProgramacin OO enJavaRelaciones entreobjetosProgramacinAvanzadapublic class Cuenta {long numero;Cliente titular;private float saldo;float interesAnual;// Constructor generalpublic Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList ();}// Constructor especfico para cuentas de ahorro (interesAnual = 0.1%)public Cuenta (long aNumero, Cliente aTitular) {this (aNumero, aTitular, 0.1);}// Resto de la clase CuentaOtra utilidad de this en Java es realizar una llamadaa un constructor desde otro constructorPero atencin: un constructor no es una operacinordinaria. nicamente puede llamarse a unconstructor desde otro constructor y debe ser laprimera instruccin de su implementacinProgramacin OO enJavaAplicacionesorientadas a objetosProgramacinAvanzadaEn una aplicacin orientada a objetos debe existiruna clase que represente la propia aplicacin. Estesera el punto donde comenzara la ejecucin de lamismaEn lenguajes no totalmente orientados como C++en la funcin main se crea una instancia de estaclase y se llama a alguna operacin como ejecutarpara arrancar la aplicacin. Sin embargo esto no esobligatorio, y un mal programador puede realizar unaaplicacin hbrida, con cdigo no orientado a objetosAplicaciones orientadas a objetospublic class BancoApp {public static void main (String[] args) {Cuenta c1 = new Cuenta (18400200, Pedro Jimnez, 0.1f);c1.ingreso (1000);System.out.println (Ingreso realizado);}}Programacin OO enJavaAplicacionesorientadas a objetosProgramacinAvanzadaEn un lenguaje orientado a objetos puro comoJava esta clase de aplicacin es obligatoria. Lamquina virtual Java se encarga de instanciar estaclase y llamar a una operacin especial con nombremain. La existencia de una operacin estticapblica con este nombre es lo que caracteriza laclase de aplicacinLa clase aplicacin debe ser pblica y no tener ningn constructor o unconstructor por defectoAl menos debe implementar la operacin main, con la siguiente declaracin:public static main (String[] args)Programacin OO enJavaAplicacionesorientadas a objetosProgramacinAvanzadaA la hora de ejecutar la aplicacin, deber indicarseesta clase a la mquina virtual JavaTras compilar los ficheros de la ltima versin de nuestro ejemplo: Cliente.java,Cuenta.java y BancoApp.java obtendremos los ficheros en byte code:Cliente.class, Cuenta.class, Movimiento.class y BancoApp.class.Finalmente, pasando la clase BancoApp.class a la mquina virtual javapondremos en funcionamiento la aplicacin$lsBancoApp.javaCliente.javaCuenta.java$javac *.java$lsBancoApp.classCliente.classCuenta.classMovimiento.classBancoApp.java Cliente.java Cuenta.java$java CuentaException in thread main java.lang.NoSuchMethodError: main$java BancoAppTransferencia realizada$La mquina virtual javaproducir un error si sele pasa una clase sinla operacin mainNota: Las clases que constituyen una aplicacin Java tambin pueden distribuirse de manera mucho ms compactaen un nico fichero JAR. Consltese la bibliografa para ver como crean y utilizan estos ficherosProgramacin OO enJavaHerenciaProgramacinAvanzadaLa herencia es un mecanismo de la OOP quepermite construir una clase incorporando de maneraimplcita todas las caractersticas de una clasepreviamente existente. Son varias las razones quejustifican su existencia:Modelado de la realidad. Son frecuentes las relaciones deespecializacin/generalizacin entre las entidades del mundo real, por tanto eslgico que dispongamos de un mecanismo similar entre las clases de objetosEvitar redundancias. Toda la funcionalidad que aporta una clase de objetos esadoptada de manera inmediata por la clase que hereda, por tanto evitamos larepeticin de cdigo entre clases semejantesFacilita la reutilizacin. Una clase no tiene por qu limitarse a recibir una seriede caractersticas de otra clase por herencia de forma pasiva. Tambindisponen de cierto margen de adaptacin de estas caractersticasSirve de soporte para el polimorfismoHerenciaProgramacin OO enJavaHerenciaProgramacinAvanzadaSea una clase A. Si una segunda clase B hereda deA entonces decimos:A es un ascendiente o superclase de B. Si la herencia entre A y B es directadecimos adems que A es la clase padre de BB es un descendiente o subclase de A. Si la herencia entre A y B es directadecimos adems que B es una clase hija de AABC DEn Java, Eiffel, Smalltalk y otros lenguajesorientados a objetos puros, todas las clases heredanautomticamente de una superclase universal. EnJava esta superclase se denomina ObjectProgramacin OO enJavaHerenciaProgramacinAvanzadaExisten diferentes situaciones en las que puedeaplicarse herencia:Especializacin. Dado un concepto B y otro concepto A que representa unaespecializacin de A, entonces puede establecerse una relacin de herenciaentre las clases de objetos que representan a A y B. En estas situaciones, elenunciado A es un B suele ser aplicableVehculoCocheEmpleadoContableFiguraCuadradoExtensin. Una clase puede servir para extender la funcionalidad de unasuperclase sin que represente necesariamente un concepto ms especfico.ListaListaSalvablerecuperar ()salvar ()CuentaCuentaconHistoricoregistra*Movimientofecha: Datetipo: Charimporte: Realsaldo: RealProgramacin OO enJavaHerenciaProgramacinAvanzadaEspecificacin. Una superclase puede servir para especificar la funcionalidadmnima comn de un conjunto de descendientes. Existen mecanismos paraobligar a la implementacin de una serie de operaciones en estosdescendientesConstruccin. Una clase puede construirse a partir de otra, simplementeporque la hija puede aprovechar internamente parte o toda la funcionalidad delpadre, aunque representen entidades sin conexin algunaListaPilaLnea TextoCuadradoObjetoGrficoseleccionar ()mover ()escalar ()cambiar color ()pintar ()Programacin OO enJavaHerenciaProgramacinAvanzadaEjemplos de herencia:Distintos tipos de cuentas bancariasCuentanumero: Longtitular: Stringsaldo: Realinteres: Realingreso ()ingresoInteresMes ()leerSaldo ()transferirA ()CuentaCorrientereintegro ()PlanPensionesvencimiento:Datecotizacion: FloatnumCuentaOrigen: StringCuentaAhorroPFijovencimiento: DateingresoMes ()Programacin OO enJavaHerenciaProgramacinAvanzadaElementos de una interfaz de usuarioFigurax, y: Integermover (nx: Integer, ny: Integer)Rectnguloancho, alto: Integerescalar (nx: Integer, ny: IntegerVentanatitulo: Stringpintar ()Editorpintar ()Botonaccion ()Programacin OO enJavaHerenciaProgramacinAvanzadaEstructuras de datosContenedornelem: Integervaciar ()copiar (c: Contenedor)tamaa (): Integervacio (): BooleanSecuenciaescribir (e: Elemento, pos: Integer)leer (pos: Integer): Elementoborrar (pos: Integer)ContenedorAsociativoescribir (e: Elemento, c: Clave)leer (c: Clave): Elementoborrar (c: Clave)Vectorbuffer[nelem]: Elementoredimensionar (t: Integer)Listacabecera: Nodoinsertar (e: Elemento, pos: Integer)insertaPrin (e: Elemento)insertarFinal (e: Elemento)TablaHashtabla[nelem]: ElementofuncionHash (c: Clave): IntegerProgramacin OO enJavaHerencia en JavaProgramacinAvanzadaVamos a estudiar la herencia en Java siguiendo unejemplo de un programador de tareasLa clase TareaPeriodica representa cualquier tarea que se ejecuta sucesivamentecada vez que se cumple el periodo de activacin (en seg.)La clase TPReloj representa un reloj que muestra en pantalla la hora cada 30 min.La clase TPAviso muestra un aviso cuando se cumple un intervalo de tiempoLa clase TPEjecucion ejecuta un comando determinado peridicamenteHerencia en JavaTareaPeriodicaperiodoSegs: Integerultimaej: Dateactiva: Boolean+necesitaEjecucion (): Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()TPReloj+leerHora (): StringTPAvisomsg: String+leerMsg (): StringTPEjecucioncmd: String+leerCmd (): StringProgramacin OO enJavaHerencia en JavaProgramacinAvanzadaLa implementacin de la clase TareaPeriodica no tiene ninguna caractersticaespecialimport java.util.*;public class TareaPeriodica {int periodoSegs; Date ultimaEj;boolean activa;public TareaPeriodica(int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;}// Constructor para ejecuciones cada segundopublic TareaPeriodica () {this (1);}public void actualizarReloj () {ultimaEj = new Date (); // Hora actual}Programacin OO enJavaHerencia en JavaProgramacinAvanzadapublic boolean necesitaEjecucion () {if (!activa)return false;// Calcular la hora de la prxima ejecucinCalendar calProximaEj = new GregorianCalendar ();calProximaEj.setTime (ultimaEj);calProximaEj.add (Calendar.SECOND, periodoSegs);Calendar calAhora = new GregorianCalendar ();// Comprobar si ha pasado a la hora actualreturn (calProximaEj.before (calAhora));}public void ejecutarTarea () {System.out.println ("Ejecucion de tarea");}public void activar () { activa = true; }public void desactivar () { activa = false; }}La operacin ejecutarTarea realmente no tiene una implementacin concreta, altratarse de una clase muy generalProgramacin OO enJavaHerencia en JavaProgramacinAvanzadaPara que una clase herede de otra, utilizaremos elindicador extends en la declaracin de la claseimport java.util.Calendar;import java.util.GregorianCalendar;public class TPReloj extends TareaPeriodica {public TPReloj () {periodoSegs = 60; // Comprobar cada minutoactualizarReloj ();activa = true;}public String leerHora () {Calendar cal = new GregorianCalendar ();return cal.get (Calendar.HOUR_OF_DAY) + ":" + cal.get (Calendar.MINUTE);}}Atencin!: Aunque el cdigo de estas clases compila perfectamente, la implementacin de losconstructores es formalmente incorrecta. Ms adelante veremos por qu.Programacin OO enJavaHerencia en JavaProgramacinAvanzadapublic class TPAviso extends TareaPeriodica {String msg;public TPAviso(String aMsg, int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;msg = aMsg;}public String leerMsg () { return msg; }}import java.lang.Runtime;import java.io.IOException;public class TPEjecucion extends TareaPeriodica { String cmd;public TPEjecucion(String aCmd, int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;cmd = aCmd;}String leerCmd () { return cmd; }}Atencin!: Aunque el cdigo de estas clases compila perfectamente, la implementacin de losconstructores es formalmente incorrecta. Ms adelante veremos por qu.Programacin OO enJavaHerencia en JavaProgramacinAvanzadaTodos las clases en Java heredan en ltimainstancia de Object. Incluso si creamos una claseindependiente, Java la hace heredar implcitamentede ObjectObject#clone (): Object+equals (Object obj): Boolean#finalize ()+getClass (): Class+hasCode (): int+notify ()+notifyAll ()+toString (): String+wait ()+wait (timeout: Long)+wait (timeout: Long, nanos: Integer)Esto hace que las clases formen una jerarqua conObject como razObject... ... ... ... ...Programacin OO enJavaHerencia en JavaProgramacinAvanzadapublic class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TareaPeriodica (5);TPAviso tpa = new TPAviso (Estudiar Programacin Avanzada !, 60);while (!tp.necesitaEjecucion ())System.println (Esperando ejecucin de tarea peridica...);tp.ejecutarTarea ();while (!tpa.necesitaEjecucion ())System.println (Esperando ejecucin de aviso...);System.println (Aviso: + tpa.leerMsg ());}}En la implementacin de una operacin de lasubclase no existe diferencia aparente entre unatributo u operacin propia de la clase y un atributo uoperacin heredadosAhora podemos crear y usar objetos de cualquiera de las clases anteriores.Desde el exterior tampoco existen diferencias aparentes entre la llamada a unaoperacin heredada o propia de la clase:Programacin OO enJavaHerencia en JavaProgramacinAvanzadaLa inicializacin de los atributos de una superclaseen el constructor de una subclase presenta variosinconvenientes serios:Resulta redundante. La superclase tiene ya un constructor que hace esetrabajo. Por qu repetir cdigo entonces?Si la clase tiene una larga lista de ascendientes, entonces el constructor seramuy largoLa superclase puede tener una inicializacin compleja, y la inclusin delcdigo de inicializacin en la subclase puede requerir un conocimientoexcesivo de la superclase por parte del implementadorpublic class TPAviso extends TareaPeriodica {String msg;public TPAviso(String aMsg, int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;msg = aMsg;}public String leerMsg () { return msg; }}Programacin OO enJavaHerencia en JavaProgramacinAvanzadaEl procedimiento correcto consiste en realizar unallamada al constructor de la superclase para querealice la inicializacin de los atributos heredadosEn Java esta llamada al constructor de lasuperclase se realiza con la instruccin superseguida de los parmetros de inicializacin dealguno de los constructores del padre de la claseLa implementacin correcta del constructor de la clase TPAviso sera por tanto lasiguiente:public class TPAviso extends TareaPeriodica {String msg;public TPAviso(String aMsg, int aPeriodoSegs) {super (aPeriodoSegs);msg = aMsg;}public String leerMsg () { return msg; }}Programacin OO enJavaHerencia en JavaProgramacinAvanzadaY de las otras dos subclases:import java.lang.Runtime;import java.io.IOException;public class TPEjecucion extends TareaPeriodica { String cmd;public TPEjecucion(String aCmd, int aPeriodoSegs) {super (aPeriodoSegs);cmd = aCmd;}String leerCmd () { return cmd; }}import java.util.Calendar;import java.util.GregorianCalendar;public class TPReloj extends TareaPeriodica {public TPReloj () {super (60);}public String leerHora () {Calendar cal = new GregorianCalendar ();return cal.get (Calendar.HOUR_OF_DAY) + ":" + cal.get (Calendar.MINUTE);}}Programacin OO enJavaHerencia en JavaProgramacinAvanzadanicamente debe llamarse a un constructor delascendiente inmediato. El constructor de este ltimorealizar a su vez una llamada a un constructor de suascendiente inmediato y as sucesivamente hastainicializar todos los atributos heredadosAsuper (...)super (...)super (...)super (...)BD CProgramacin OO enJavaHerencia en JavaProgramacinAvanzadaPara terminar, es posible impedir la herencia a partirde una clase declarndola como finalSin embargo, esta es una caracterstica que debe serutilizada con prudencia, ya que puede restringir enexceso la extensin y reutilizacin de las clases delsistema en el futuroimport java.lang.Runtime;import java.io.IOException;final public class TPEjecucion extends TareaPeriodica { String cmd;public TPEjecucion(String aCmd, int aPeriodoSegs) {super (aPeriodoSegs);cmd = aCmd;}String leerCmd () { return cmd; }}Programacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaLa herencia en s no sera tan interesante si no fuerapor la posibilidad de adaptar en el descendiente losmiembros heredadosAdicin. Trivialmente el descendiente puede aadir nuevos atributos yoperaciones que se suman a los recibidos a travs de la herenciaRedefinicin. Es posible redefinir la implementacin de una operacin heredadapara adaptarla a las caractersticas de la clase descendiente. Tambin esposible cambiar el tipo de un atributo heredadoAnulacin. Cuando un atributo u operacin heredados no tienen utilidad en eldescendientes, pueden ser anulados para impedir su utilizacinNo todos los lenguajes orientados a objetos soportanestas caractersticas, en especial la anulacinAdicin, redefinicin y anulacinProgramacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaLa redefinicin se realiza en Java y la mayora de loslenguajes OO definiendo nuevamente la operacin enel descendiente, utilizando exactamente el mismonombre y lista de argumentosLas clases descendientes TPReloj, TPEjecucion y TPAviso no son capaces derealizar su misin porque la implementacin de ejecutarTarea que contienen es laheredada de TareaPeriodica, que no hace nada en particular. Es preciso redefiniresta operacin en cada una de las subclases para que cumpla la funcin que seespera de ellaTareaPeriodicaperiodoSegs: Integerultimaej: Dateactiva: Boolean+necesitaEjecucion (): Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()TPReloj+leerHora (): StringTPAvisomsg: String+leerMsg (): StringTPEjecucioncmd: String+leerCmd (): StringProgramacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaimport java.util.Calendar;import java.util.GregorianCalendar;public class TPReloj extends TareaPeriodica {public TPReloj () {super (60);}public String leerHora () {Calendar cal = new GregorianCalendar ();return cal.get (Calendar.HOUR_OF_DAY) + ":" + cal.get (Calendar.MINUTE);}public void ejecutarTarea () {Calendar cal = new GregorianCalendar ();int min = cal.get (Calendar.MINUTE);if (min == 0 || min == 30)System.out.println ("Hora: " + cal.get (Calendar.HOUR_OF_DAY) + " " + min);}}Programacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadapublic class TPAviso extends TareaPeriodica {String msg;public TPAviso(String aMsg, int aPeriodoSegs) {super (aPeriodoSegs);msg = aMsg;}public String leerMsg () { return msg; }public void ejecutarTarea () {System.out.println ("ATENCIN AVISO: " + msg);desactivar ();}}import java.lang.Runtime;import java.io.IOException;public class TPEjecucion extends TareaPeriodica { String cmd;public TPEjecucion(String aCmd, int aPeriodoSegs) {super (aPeriodoSegs);cmd = aCmd;}String leerCmd () { return cmd; }public void ejecutarTarea () {try {Runtime.getRuntime ().exec (cmd);}catch (IOException e) {System.out.println ("Imposible ejecutar comando: " + cmd);}}}Programacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaCada tarea ejecuta ahora su funcin, aunque la llamada es aparentemente lamismapublic class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TareaPeriodica (5);TPAviso tpa = new TPAviso (Estudiar Programacin Avanzada !, 60);TPEjecucion tpe = new TPEjecucion (rm ~/tmp/*, 3600);while (!tp.necesitaEjecucion ())System.println (Esperando ejecucin de tarea peridica...);tp.ejecutarTarea ();while (!tpa.necesitaEjecucion ())System.println (Esperando ejecucin de aviso...);tpa.ejecutarTarea ();while (!tpr.necesitaEjecucion ())System.println (Esperando ejecucin de comando...);tpe.ejecutarTarea ();}}Despus de la redefinicin, en el descendiente esposible llamar a la versin original de la operacin enel ascendiente mediante:super.nombreOperacionRedefinida ()import java.util.*;public class TareaPeriodica {int periodoSegs; Date ultimaEj;boolean activa;public TareaPeriodica(int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;}public TareaPeriodica () { this (1); }final public void actualizarReloj () {ultimaEj = new Date (); // Hora actual}final public boolean necesitaEjecucion () {// Implementacin de la operacin}public void ejecutarTarea () {System.out.println ("Ejecucion de tarea");}final public void activar () { activa = true; }final public void desactivar () { activa = false; }}Programacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaOtro uso posible de la palabra clave final es impedirla redefinicin de una operacin en las subclasespublic class TPAviso extends TareaPeriodica {String msg;// Impedir el acceso desde el exterior y las subclases// al atributo activaprivate boolean activa;public TPAviso(String aMsg, int aPeriodoSegs) {super (aPeriodoSegs);msg = aMsg;}// Resto de la implementacin de la clase a partir de aquProgramacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaLa anulacin es un mecanismo menos til, y conmenor soporte por parte de los lenguajes deprogramacinEn Java es posible impedir el acceso a un atributoredeclarndolo en una subclase como privado oprotegido, segn sea el nivel de proteccin que sedeseepublic class TPAviso extends TareaPeriodica {String msg;public TPAviso(String aMsg, int aPeriodoSegs) {super (aPeriodoSegs);msg = aMsg;}public void activar () {}public void desactivar () { System.out.printl (Error: llamada a operacin privada);System.getRuntime ().exit (1); }public String leerMsg () { return msg; }public void ejecutarTarea () {System.out.println ("ATENCIN AVISO: " + msg);desactivar ();}}Programacin OO enJavaAdicin,redefinicin yanulacinProgramacinAvanzadaSin embargo, Java no permite redefinir unaoperacin haciendo su nivel de acceso ms restrictivoUna solucin parcial consistira en redefinirla comovaca o incluyendo un cdigo que impida su utilizacinProgramacin OO enJavaProteccin yherenciaProgramacinAvanzadaHemos visto anteriormente como los distintos nivelesde proteccin limitan el acceso a los miembros de laclase desde el exterior. Pero como afectan estosniveles de proteccin a los miembros heredados?Miembros pblicos. Son accesibles desde los descendientes, y se heredan comopblicosMiembros privados. No son accesibles desde los descendientesMiembros con acceso a nivel de paquete. Son accesibles desde los descendientessiempre y cuando pertenezcan al mismo paquete que el ascendiente. Se heredancon el mismo nivel de proteccinUn nuevo nivel de proteccin es el de miembrosprotegidos (protected). Un miembro protegido esaccesible nicamente desde los descendientesProteccin y herenciaProgramacin OO enJavaProteccin yherenciaProgramacinAvanzadaAdems, un miembro protegido mantiene en lasubclase el nivel de acceso protegidoEn nuestro ejemplo, los atributos de la clase TareaPeriodica son accesiblesdesde TPReloj, TPEjecucion y TPAviso porque al pertenecer al mismo paqueteson amigasPara permitir el acceso a los atributos de la clase TareaPeriodica nicamentedesde los descendientes es conveniente marcarlos como protegidosimport java.util.*;public class TareaPeriodica {protected int periodoSegs; protected Date ultimaEj;boolean activa;public TareaPeriodica(int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;}// Resto de operaciones de la clase a partir de aqu Programacin OO enJavaPolimorfismoProgramacinAvanzadaSon dos mecanismos relacionados que otorgan a laOOP una gran potencia frente a otros paradigmas deprogramacinnicamente tienen sentido por la existencia de laherenciaEl polimorfismo (o upcasting) consiste en la posibilidadde que una referencia a objetos de una clase puedaconectarse tambin con objetos de descendientes destaPolimorfismoB rb = new B (); // Asignacin ordinaria A ra = rb; // Asignacin polimorfara: ABArb: Bobjeto: BProgramacin OO enJavaPolimorfismoProgramacinAvanzadapublic class AppGestorTareas {public static void main (String[] args) {TPReloj tpr = new TPReloj ();TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);TareaPeriodica tp;tp = tpr;tp.desactivar ();tp = tpa;tp.desactivar ();tp = tpe;tp.desactivar (); }}El sentido del polimorfismo es realizar una generaliza-cin, olvidar los detalles concretos de uno o variosobjetos de distintas clases y buscar un punto comn atodos ellos en un ancestroSe trata de algo que realiza comnmente la mentehumana durante el proceso de razonamientoProgramacin OO enJavaPolimorfismoProgramacinAvanzadaLa mayora de las veces, las conexiones polimorfas serealizan de manera implcita en el paso de argumentosa una operacin. De esta manera es posible escribiroperaciones polimorfas que reciban objetos demltiples clasespublic class AppGestorTareas {private static void esperarEjecutar (TareaPeriodica tp){while (!tp.necesitaEjecucion ());tp.ejecutarTarea ();}public static void main (String[] args) {TPReloj tpr = new TPReloj ();TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);esperarEjecutar (tpr);esperarEjecutar (tpa);esperarEjecutar (tpe);}}Programacin OO enJavaPolimorfismoProgramacinAvanzadaOtra aplicacin muy til es la construccin deestructuras de datos que puedan mantener objetos dedistintas clasesVamos a implementar una nueva clase GestorTareas que va a contener una lista detareas a realizar. La llamada a chequearEjecutar realizar la comprobacin y ejecucinde las tareas que lo requieranimport java.lang.Exception;class DemasiadasTareas extends Exception {}public class GestorTareas {TareaPeriodica[] tareas;int nTareas, maxTareas;public GestorTareas (int aMaxTareas) {nTareas = 0;maxTareas = aMaxTareas;tareas = new TareaPeriodica[maxTareas];}// Sigue... import java.lang.System;public class AppGestorTareas {public static void main (String[] args) {GestorTareas gt = new GestorTareas (10);try {gt.nuevaTarea (new TPReloj ());gt.nuevaTarea (new TPAviso (Ha pasado un minuto, 60));gt.nuevaTarea (new TPEjecucion (/bin/sync, 120));} catch (DemasiadasTareas e) {System.out.println (Mmmm.... esto no deberia haber pasado);}gt.chequearEjecutar ();}}Programacin OO enJavaPolimorfismoProgramacinAvanzada// Continuacin de la clase GestorTareaspublic void nuevaTarea (TareaPeriodica tp) throws DemasiadasTareas {if (nTareas == maxTareas)throw new DemasiadasTareas ();tareas[nTareas++] = tp;}public void chequearEjecutar (){for (int t = 0; t < nTareas; t++)if (tareas[t].necesitaEjecucion ())tareas[t].ejecutarTarea ();}}Programacin OO enJavaPolimorfismoProgramacinAvanzadaPero siempre debe quedar claro que tras la conexinpolimorfa nicamente podemos acceder a las opera-ciones pertenecientes a la clase asociada a la refe-rencia. El resto de operaciones del objeto no sonaccesibles a travs de esta referenciapublic class AppGestorTareas {public static void main (String[] args) {TPReloj tpr = new TPReloj ();TareaPeriodica tp;tp = tpr;tp.desactivar (); // Oktp.leerHora ()// Error !!tpr.leerHora ();// Ok}}AppGestorTareas.java:XX: cannot resolve symbolsymbol: method leerHora ()location: class TareaPeriodicatp.leerHora ();^1 errorProgramacin OO enJavaPolimorfismoProgramacinAvanzadaEn Java, una referencia a Object puede ser conec-tada a cualquier objeto, puesto que como sabemos esun ancestro de todas las clasespublic class AppGestorTareas {public static void main (String[] args) {TPReloj tpr = new TPReloj ();Object o;o = tpr;System.out.println (o.getClass ().getName ());}}Adems, las interfaces implementadas por una clasetambin pueden ser utilizadas para realizar conexionespolimorfas. Es decir, las interfaces que implementa unaclase se comportan igual que las superclases en lo querespecta al uso del polimorfismoProgramacin OO enJavaLigadura dinmicaProgramacinAvanzadaEntendemos por resolucin de una llamada el procesopor el cual se sustituye una llamada a una funcin porun salto a la direccin que contiene el cdigo de estafuncinNormalmente, la resolucin de llamadas se realiza enen tiempo de compilacin, porque resulta ms sencilloy sobre todo ms eficiente. Cuando la aplicacin seest ejecutando, las llamadas ya estn preparadas.Este enfoque se denomina ligadura estticaLigadura dinmicaf ()CALL _fProgramacin OO enJavaPolimorfismo yligadura dinmicaProgramacinAvanzadaEl problema aparece en OOP cuando realizamos unaconexin polimorfa y llamamos a una operacinredefinidaA r = ??r.f ()CALL _A_f ?CALL _B_f ?CALL _C_f ?Af ()El compilador no tiene informacin para resolver lallamada. Por defecto utilizara el tipo de la referencia, ypor tanto generara una llamada a la implementacinde f () en la clase APero la referencia r puede apuntar a objetos de lasclases A, B o C, con distintas versiones de f ()Bf ()Cf ()Programacin OO enJavaPolimorfismo yligadura dinmicaProgramacinAvanzadaLa solucin consiste en esperar a resolver la llamadaal tiempo de ejecucin, cuando se conoce realmentelos objetos conectados a r, y cul es la versin de f ()apropiada. Este enfoque de resolucin de llamadas sedenomina ligadura dinmica y es mucho ms lenta ycompleja que la estticaHay tres enfoques posibles a la hora de abordar elproblema de la resolucin de llamadasEstablecer la ligadura esttica por defecto. El programador puede activar laligadura dinmica para una funcin concreta cuando lo ve necesario,declarndolas como virtuales (C++)Utilizar un compilador inteligente que decide la ligadura esttica o dinmica enfuncin del empleo que se hace de cada funcin (Eiffel)Establecer la ligadura dinmica para todas las funciones y evitar problemas acosta de eficiencia en la ejecucin (Smalltalk, Java)Programacin OO enJavaPolimorfismo yligadura dinmicaProgramacinAvanzadapublic class AppGestorTareas {public static void main (String[] args) {TPReloj tpr = new TPReloj ();TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);TareaPeriodica tp;tp = tpr;tp.ejecutarTarea (); // Versin de TPRelojtp = tpa;tp.ejecutarTarea (); // Versin de TPAvisotp = tpe;tp.ejecutarTarea (); // Versin de TPEjecucion}}Por tanto, la ligadura dinmica, por defecto en Java,garantiza siempre la llamada a la versin correcta decada funcin, con independencia del uso deconexiones polimorfas o noLas llamadas a la funcin ejecutarTarea se resuelven correctamente, a pesar derealizarse a travs de una referencia a TareaPeriodicaProgramacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaTras realizar una conexin polimorfa es frecuente lanecesidad de volver a recuperar el objeto original, paraacceder a sus operaciones propiasSe trata de la operacin inversa al polimorfismo(upcasting), denominada downcastingSi el polimorfismo implica una generalizacin, eldowncasting implica una especializacinAl contrario que el upcasting, el downcasting no puederealizarse directamente mediante una conexin conuna referencia de la clase del objetoInformacin de clases en tiempo deejecucinProgramacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaTras crear un objeto de tipo TPReloj y conectarlo mediante una referencia aTareaPeriodica, intentamos recuperar nuevamente una referencia de tipo TPReloj alobjeto. No es posible de manera directapublic class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TPReloj ();// upcastingTPReloj tr = tp;// downcasting ?}}AppGestorTareas.java:XX: incompatible typesfound : TareaPeriodicarequired: TPRelojTPReloj tr = tp;^1 errorUn simple casting nos permitir forzar la conexin a lareferenciapublic class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TPReloj ();// upcastingTPReloj tr = (TPReloj) tp;// downcasting}}Programacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaPero cuidado ! El casting de Java es inteligente. Unintento de conexin imposible producir una excepcinClassCastException durante la ejecucinException in Thread main java.lang.ClassCastExceptionat AppGestorTareas.main(AppGestorTareas.java:XX)public class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TPReloj ();// upcastingTPReloj tr = (TPReloj) tp;// downcasting ok// Downcasting imposible: lanza excepcin ClassCastException TPAviso ta = (TPAviso) tp;}}Programacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaPodemos capturar esta excepcin para determinar siel objeto apuntado por la referencia era del tipoesperado o no, realizando acciones diferentes en cadacasoimport java.lang.*;public class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp;TPReloj tr;// Posiblemente en algn punto la referencia tp ha sido conectada con un objeto// de la clase TPReloj...try {tr = (TPReloj) tp;System.out.println (La hora actual es: + tr.leerHora ());}catch (ClassCastException e) {System.out.println (La referencia tp no apunta a un objeto de la clase TPReloj);}}}Programacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaimport java.lang.*;public class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp; TPReloj tr; TPAviso ta; TPEjecucion te;// tp es conectada a algn objeto...try {tr = (TPReloj) tp;// Operar con trreturn;}catch (ClassCastException e) {// Si no es de tipo TPReloj, continuamos por aqu}try {ta = (TPAviso) tp;// Operar con tareturn;}catch (ClassCastException e) {// Si no es de tipo TPAviso, continuamos por aqu}try {te = (TPEjecucion) tp;// Operar con tereturn;}catch (ClassCastException e) {// Si tampoco es de tipo TPEjecucin Entonces de que tipo es?System.out.println (Error: objeto de clase desconocida);}}}import java.lang.ClassCastException;import java.lang.System;public class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp; TPReloj tr; TPAviso ta; TPEjecucion te;// tp es conectada a algn objeto...if (tp instanceof TPReloj) {tr = (TPReloj) tp;// Operar con tr}elseif (tp instanceof TPAviso) {ta = (TPAviso) tp;// Operar con ta}elseif (tp instanceof TPEjecucion) {te = (TPEjecucion) tp;// Operar con te}elseSystem.out.println (Error: objeto de clase desconocida);}}Programacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaMucho ms cmodo es utilizar instanceof paradetermina si el objeto es de la clase esperada antes derealizar el castingimport java.lang.ClassCastException;import java.lang.System;public class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp;// tp es conectada a algn objeto...Class c = tp.getClass ();System.out.println (La referencia tp apunta a un objeto de la clase: + c.getName ());Class c = TareaPeriodica.class;if (c.isInterface ())System.out.println (TareaPeriodica es una Interfaz);}Programacin OO enJavaInformacin declases en tiempo deejecucinProgramacinAvanzadaLa operacin getClass () de Object devuelve un objetode la clase Class que permite obtener en tiempo deejecucin gran cantidad de informacin de la clase a laque pertenece el objeto. El atributo esttico class de laclase tambin devuelve una referencia a este objetoProgramacin OO enJavaClases abstractasProgramacinAvanzadaExisten clases que representan conceptos tangenricos que no tiene sentido su instanciacin enobjetosAdems en este tipo de clases puede ser imposible ointil la implementacin de ciertas operacionesLa utilidad de este tipo de clases est en la aplicacinde herencia para obtener clases que representanconceptos concretos para los que s que tiene sentidosu instanciacinLa clase TareaPeriodica es un claro ejemplo: por s sola no tiene utilidad, perosimplifica mucho la construccin de las otras tres clases. De hecho, la operacinejecutarTarea en TareaPeriodica no tiene una implementacin tilClases abstractasProgramacin OO enJavaClases abstractasProgramacinAvanzadaEstas clases se denominan clases abstractas y estetipo de operaciones sin implementacin posible,operaciones abstractasLas operaciones abstractas deben ser implemen-tadas obligatoriamente en alguna de las subclasespara que la clase correspondiente sea instanciableUna clase abstracta puede no tener ningunaoperacin abstracta, pero una clase que contenga almenos una operacin abstracta debe ser declaradacomo abstractaEn Java, tilizando la declaracin abstract podremosestablecer una clase o una operacin como abstractaimport java.util.*;abstract class TareaPeriodica {int periodoSegs; Date ultimaEj;boolean activa;public TareaPeriodica(int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj ();activa = true;}public TareaPeriodica () { this (1); }public void actualizarReloj () {ultimaEj = new Date (); // Hora actual}public boolean necesitaEjecucion () {if (!activa)return false;// Resto de la implementacin de esta// operacin aqu}abstract public void ejecutarTarea ();public void activar () { activa = true; }public void desactivar () { activa = false; }}Programacin OO enJavaClases abstractasProgramacinAvanzadaVamos a declarar la clase TareaPeriodica y su operacin ejecutarTarea comoabstractasProgramacin OO enJavaClases abstractasProgramacinAvanzadaJava devuelve ahora un error en tiempo de compilacin si se intenta crear unobjeto de la clase TareaPeriodicapublic class AppGestorTareas {public static void main (String[] args) {TareaPeriodica tp = new TareaPeriodica (5);while (!tp.necesitaEjecucion ())System.println (Esperando ejecucin de tarea peridica...);tp.ejecutarTarea ();}}AppGestorTareas.java:XX: class TareaPeriodica is an abstract class; cannot be instantiatedTareaPeriodica tp = new TareaPeriodica ();^1 errorLa abstraccin de una clase se propaga por lajerarqua de herencia hasta que todas las operacionesquedan implementadas. Es decir, la primera claseinstanciable es aquella con todas las operacionesimplementadasProgramacin OO enJavaClases abstractasProgramacinAvanzadaLa idea de clase abstracta, llevada al extremo, noslleva en Java a las interfaces. Una interfaz es similara una clase totalmente abstracta:Todas las operaciones de la interfaz son implcitamente abstractas, es decir,carecen de implementacinUna interfaz no puede contener atributosLas interfaces sirven para especificar las operacionesque obligatoriamente deben implementar una serie declasesLa implementacin de una interfaz no se realizamediante herencia (extends) sino medianteimplements. No obstante, el comportamiento essimilar al de la herencia, aunque ms sencilloProgramacin OO enJavaClases abstractasProgramacinAvanzadaSi una clase declara la implementacin de unadeterminada interfaz, esta implementacin debe sercompleta, es decir, de todas las operaciones de lainterfazPodemos transformar TareaPeriodica en una interfaz, de forma que especifique loque tiene que implementar cualquier clase que represente una tarea peridica. Esteenfoque proporciona mayor libertad a la hora de disear las otras clases

TareaPeriodica+necesitaEjecucion (): Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()TPReloj+leerHora():String+necesitaEjecucion (): Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()TPAvisomsg: String+leerMsg ():String+necesitaEjecucion (): Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()TPEjecucioncmd:String+leerCmd (): String+necesitaEjecucion():Boolean+actualizarReloj ()+ejecutarTarea ()+activar ()+desactivar ()Programacin OO enJavaClases abstractasProgramacinAvanzadaLa interfaz TareaPeriodica y la clase TPReloj tendran ahora el siguiente aspecto.Las otras clases tendran implementaciones similaresimport java.util.Calendar;import java.util.GregorianCalendar;public class TPReloj implements TareaPeriodica {Date ultEjecucion;boolean activa;public TPReloj () { activa = true; ultEjecucion = new Date () }public void ejecutarTarea () {Calendar cal = new GregorianCalendar ();int min = cal.get (Calendar.MINUTE);System.out.println ("Hora: " + cal.get (Calendar.HOUR_OF_DAY) + " " + min);ultEjecucion = cal.getTime ();}public interface TareaPeriodica {boolean necesitaEjecucion ();void ejecutarTarea ();void activar ();void desactivar ();}Programacin OO enJavaClases abstractasProgramacinAvanzadapublic boolean necesitaEjecucion () {if (!activa)return false;Calendar calProximaEj = new GregorianCalendar ();Calendar calUltEjecucion = new GregorianCalendar ();calUltEjecucion.setTime (ultEjecucion);Calendar calAhora = new GregorianCalendar ();if (calAhora.equal (calUltEjecucion))return false;int min = calAhora.get (Calendar.MINUTE);if (min == 00 || min == 30)return true;return false;}public void activar () { activa = true; }public void desactivar () { activar = false; }public String leerHora () {Calendar cal = new GregorianCalendar ();return cal.get (Calendar.HOUR_OF_DAY) + ":" + cal.get (Calendar.MINUTE);}}Programacin OO enJavaClases abstractasProgramacinAvanzadaUna clase puede implementar ms de una interfazUna interfaz puede heredar de otra interfazCuando utilizar una interfaz en lugar de una claseabstracta?Por su sencillez se recomienda utilizar interfaces siempre que sea posibleSi la clase debe incorporar atributos, o resulta interesante la implementacin dealguna de sus operaciones, entonces declararla como abstractaEn la biblioteca de clases de Java se hace un usointensi