1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1....

29
Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos abstractos de datos (clases) es un concepto fundamental en la POO. Es posible la creación de variables de un tipo (objeto o instancia) y manipularlas (mensajes). Los miembros de cada clase comparten algunos rasgos comunes. Siempre que aparezca la palabra clave “tipo” (type) puede sustituirse por la “clase” (class) y viceversa. Las peticiones que se puedan hacer a un objeto se encuentran definidas en su interfaz, que viene determinada por el tipo de objeto. La interfaz establece qué peticiones pueden hacerse a un objeto en particular. 1.2 La implementación oculta. La creación de clases debe ser de forma que únicamente se exponga lo necesario, ocultando el resto. Este enfoque permite la modificación de la parte oculta sin preocuparse de las implicaciones de la modificación. Otro motivo es evitar las manipulaciones indebidas de los métodos de las clases. Java usa tres palabras clave para establecer los límites en una clase, estos modificadores de acceso determinan quién puede usar las definiciones a las que preceden: public: Las definiciones están disponibles para todo el mundo. private: Sólo el creador del tipo puede acceder a esas definiciones. Si se intenta acceder se obtiene un error en tiempo de compilación. protected: Actúa como privada con la diferencia de que una clase heredada tiene acceso a miembros protegidos pero no a los privados. Cuando no se especifica el modo tiene un acceso por defecto, se suele denominar acceso amistoso (friendly) ya que las clases pueden acceder a los miembros amigos de otras clases que estén en el mismo paquete (package), fuera del paquete, estos miembros amigos se convierten en private. 1.3 Reutilizar la implementación La manera más simple de reutilizar una clase es usar un objeto de esta clase, también es posible ubicar un objeto de esa clase dentro de otra clase, creación de un objeto miembro. La nueva clase puede construirse a partir de un número indefinido de otros objetos, de igual o distinto tipo, en cualquier combinación necesaria para lograr la funcionalidad deseada dentro de la nueva clase. Este concepto es la composición (agregación), que se representa mediante la relación “es- parte-de”. La composición conlleva una gran carga de flexibilidad. Los objetos miembros de la nueva clase suelen ser privados. Esto permite cambiar los miembros en tiempo de ejecución, para así cambiar de manera dinámica el comportamiento de un programa. La herencia no es tan flexible, ya que el compilador debe emplazar restricciones de tiempo de compilación en las clases creadas por herencia. Es recomendable intentar el uso de la composición (simple y sencilla) que aplicar herencia. 1.4 Herencia: Reutilizar la interfaz. La herencia expresa la semejanza entre tipos haciendo uso del concepto de tipos base y tipos derivados. Un tipo base contiene todas las características y comportamientos que comparten los tipos que de él se derivan. El uso de la herencia permite construir una jerarquía de tipos que expresa el problema en términos de los propios tipos. De esta forma el modelo principal lo constituye la jerarquía de tipos, de manera que se puede ir directamente de la descripción del sistema en el mundo real a la descripción del sistema en código. Al heredar a partir de un tipo existente, se crea un nuevo tipo. Este nuevo tipo contiene no sólo los miembros del tipo existente (aunque los datos private estén ocultos e inaccesibles) sino que duplica la interfaz de la clase base. Hay dos formas de diferenciar el comportamiento de la clase derivada de la clase base original. El primero es añadir nuevas funciones. La segunda (y más importante) es variar el comportamiento de una función ya existente en la clase base. A esto se le llama redefinición (anulación o superposición) de la función. Para ello simplemente se crea una nueva definición de la función dentro de la clase derivada. 1.4.1 La relación es-un frente a la relación es-como-un El principio de sustitución dice que la filosofía a seguir entre clases bases y derivadas es sólo superponer las funciones de la clase base (un círculo es un polígono), es lo que se conoce como relación es-un, en esta relación es posible sustituir un objeto de la clase derivada por otro de la clase base. J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 1

Transcript of 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1....

Page 1: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

1. Introducción a los objetos

1.1 Todo objeto tiene una interfaz.

La creaciónde tipos abstractosde datos(clases)esun conceptofundamentalen la POO.Es posiblela creacióndevariablesdeun tipo (objetoo instancia)y manipularlas(mensajes).Los miembrosdecadaclasecompartenalgunosrasgoscomunes. Siempre que aparezca la palabra clave “tipo” (type) puede sustituirse por la “clase” (class) y viceversa.

Las peticionesque sepuedanhacera un objetoseencuentrandefinidasen su interfaz, quevienedeterminadapor eltipo de objeto. La interfaz establece qué peticiones pueden hacerse a un objeto en particular.

1.2 La implementación oculta.

La creaciónde clasesdebeserde forma que únicamentese expongalo necesario,ocultandoel resto.Esteenfoquepermitela modificaciónde la parteocultasin preocuparsede las implicacionesde la modificación.Otro motivo esevitarlas manipulaciones indebidas de los métodos de las clases.

Javausatrespalabrasclaveparaestablecerlos límitesen unaclase,estosmodificadoresde accesodeterminanquiénpuede usar las definiciones a las que preceden:

�public: Las definiciones están disponibles para todo el mundo.�private: Sólo el creadordel tipo puedeaccedera esasdefiniciones.Si se intentaaccederseobtieneun error entiempo de compilación.�protected: Actúacomoprivadacon la diferenciade queunaclaseheredadatieneaccesoa miembrosprotegidospero no a los privados.�Cuandono seespecificael modotieneun accesopor defecto, sesueledenominaraccesoamistoso(friendly) yaque las clasespuedenaccedera los miembrosamigosde otrasclasesqueesténen el mismopaquete(package),fuera del paquete, estos miembros amigos se convierten en private.

1.3 Reutilizar la implementación

La maneramássimpledereutilizarunaclaseesusarunobjetodeestaclase,tambiénesposibleubicarun objetodeesaclasedentro de otra clase,creación de un objeto miembro. La nuevaclase puedeconstruirsea partir de un númeroindefinido de otros objetos,de igual o distinto tipo, en cualquiercombinaciónnecesariapara lograr la funcionalidaddeseada dentro de la nueva clase. Este concepto es la composición (agregación), que se representa mediante la relación “es-parte-de”.

La composiciónconllevaunagrancargade flexibilidad. Los objetosmiembrosde la nuevaclasesuelenserprivados.Estopermitecambiarlos miembrosentiempodeejecución,paraasícambiardemaneradinámicael comportamientodeunprograma.

La herenciano es tan flexible, ya que el compiladordebeemplazarrestriccionesde tiempo de compilaciónen lasclases creadas por herencia. Es recomendable intentar el uso de la composición (simple y sencilla) que aplicar herencia.

1.4 Herencia: Reutilizar la interfaz.

La herenciaexpresala semejanzaentretipos haciendousodel conceptode tiposbasey tiposderivados.Un tipo basecontienetodaslas característicasy comportamientosquecompartenlos tipos quede él sederivan.El usode la herenciapermiteconstruirunajerarquíadetiposqueexpresael problemaentérminosdelos propiostipos.De estaformael modeloprincipal lo constituyela jerarquíade tipos, de maneraque sepuedeir directamentede la descripcióndel sistemaen elmundo real a la descripción del sistema en código.

Al heredara partir deun tipo existente,secreaun nuevotipo. Estenuevotipo contieneno sólolos miembrosdel tipoexistente (aunque los datos private estén ocultos e inaccesibles) sino que duplica la interfaz de la clase base.

Hay dosformasde diferenciarel comportamientode la clasederivadade la clasebaseoriginal. El primeroesañadirnuevasfunciones.La segunda(y másimportante)esvariarel comportamientodeunafunciónyaexistenteenla clasebase.A esto se le llama redefinición(anulacióno superposición)de la función. Paraello simplementese crea una nuevadefinición de la función dentro de la clase derivada.

1.4.1 La relación es-un frente a la relación es-como-unEl principio desustitucióndicequela filosofía a seguirentreclasesbasesy derivadasessólosuperponerlasfunciones

de la clase base (un círculo es un polígono), es lo que se conoce como relación es-un, en esta relación es posible sustituir unobjeto de la clase derivada por otro de la clase base.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 1

Page 2: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

Existencasosen los que es necesarioañadir nuevoselementosa la interfaz del tipo derivado,extendiendoasí lainterfazy cuandoun nuevotipo, en estecasola sustituciónpor el tipo baseno esperfectoy estarelaciónsedefinees-como-un.

1.5 Objetos intercambiables con polimorfismo

Sepuededeseartratarun objeto comosu tipo base,con lo queel códigono dependeráde tipos específicos.En loscompiladoresno-OOunallamadaa unafunción creauna ligadura temprana, esdecir,generauna llamadaa unafuncióncon nombreespecíficoy el montadorresuelveestallamadaa la direcciónabsolutadel código a ejecutar.En POO, elprogramanopuededeterminarla direccióndel códigohastatiempodeejecución,utilizándoseotro esquema,el de ligaduratardía, al enviar un mensaje a un objeto, no se determina el código invocado hasta el tiempo de ejecución. El compilador seasegurade que la función exista y hace la comprobaciónde tipos de los argumentosy del valor de retorno,pero sedesconoce el código exacto a ejecutar.

El procesodetratarun tipo derivadocomosi fuerael tipo basesele llamaconversiónde tipos(moldeado)haciaarriba(casting), es decir, moverse hacia arriba por el diagrama de herencias.

1.5.1 Clases base abstractas e interfacesPuedeserdeseableque la clasebasesólo presenteuna interfaz parasusclasesderivadas,es decir, que no se creen

objetosde ella, sino sólo de las derivadas.Esto se consigueconvirtiendoesaclaseen abstractacon la palabraclaveabstrac. Si se intenta construir un objeto de una clase abstracta el compilador lo evita.

Tambiénsepuedeutilizar la palabraclaveabstrac paradescribirun métodoqueaúnno hapodidoserimplementando,un métodoabstractosólo puedeexistir dentrode una claseabstracta.Cuandoseheredala clase,debeimplementarseelmétodoo delo contrariola claseheredadaseconvierteenabstracta.La creacióndemétodosabstractospermitenponerunmétodo en una interfaz sin verse forzado a proporcionar un fragmento de código para ese método.

La palabraclave interface tomael conceptode claseabstracta,evitandototalmentelas definicionesde funciones,esuna herramienta muy útil al proporcionar la separación perfecta entre interfaz e implementación.

1.6 Localización de objetos y longevidad

Un factor importanteen la POO es la manerade creary destruirobjetos.Javautiliza el enfoquede crearobjetosdinámicamenteenel montículo(heap).Enesteenfoque,noesnecesarioconocerhastael tiempodeejecuciónel númerodeobjetos, longevidad o tipo. Si se necesitaun nuevo objeto simplementese construyeen el montículo. Como elalmacenamientosegestionadinámicamente,en tiempodeejecución,la cantidadde tiemponecesariaparaasignarespaciode almacenamientoen el montículoes mayor que el necesarioen la pila. Sin embargola flexibilidad es esencialpararesolverengenerallosproblemasdeprogramación.Cadavezquesedeseacrearun objetoseusala palabraclavenew paraconstruir una instancia dinámica de ese objeto.

El aspectodela longevidadseresuelve,enel casode la pila, por el compiladorquedeterminacuántoduracadaobjetoy puededestruirlo cuandono es necesario.En el enfoquedel montículo el compiladorno tiene conocimientode suduración,lo proporcionaun recolectordebasuraquedescubreautomáticamentecuándosehadejadodeutilizar un objeto,y puede ser destruido. Esto disminuye la cantidad de código y ofrece un nivel superior de seguridad.

1.6.1 Colecciones e iteradores.En un problemaconcretosepuedendesconocerel númeroy duracióndeobjetosparasolucionarlo,y enconsecuencia

cómoalmacenarlos.En la POOsesolucionacreandootro tipo deobjetosquetienereferenciasaotrosobjetos.Ademásestenuevoobjeto,llamadocontenedor, seexpandiráa sí mismocuandoseanecesarioparaalbergartodo lo quesecoloqueensu interior.

Todoslos contenedorestienenalgunamanerade introducir y extraercosas,perola extracciónpuedeserproblemáticaporqueunafunción de selecciónúnicasueleserrestrictiva.La soluciónesun iterador, queesun objetocuyo trabajoesseleccionarlos elementosde dentrode un contenedory presentárselosal usuario.Como clasetambiénproporcionauncierto nivel de abstracción,que puedeser usadapara separarlos detallesdel contenedordel código al que ésteestéaccediendo.El contenedorseabstraea travésdel iteradorhastaconvertirseenunasecuencia,quesepuederecorrerconeliterador, sin preocuparsede la estructurasubyacente(Arraylist, LinkedList, Stack...). Java2 cuentacon un iteradordenominado Iterator (en Java 1.0 y 1.1 Enumeration).

Página 2 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 3: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

1.6.2 Jerarquía de raíz única.En Javatodaslasclasesheredan,enúltima instancia,deunaúnicaclasebase,Object. De estaformatodoslos objetos

tienen una interfaz común, por lo que en última instancia son del mismo tipo.Puedegarantizarsequetodoslos objetosdeunajerarquíaderaízúnicatienenciertafuncionalidady junto a la creación

detodoslos objetosenel montículosimplifica el pasodeargumentos.Ademássimplifica la implementacióndel recolectorde basuraya quesusoportesepuedeinstalaren la clasebasey podráenviarlos mensajesapropiadosa todoslos objetosdel sistema.

Dadoqueestágarantizadoque en tiempode ejecuciónla informaciónde tipos estáen todoslos objetos,jamásseráimposibleencontrarun objetocuyo tipo no puedaserdeterminado,estoesimportanteenoperacionesa nivel desistemaypor la flexibilidad que proporciona al programar.

1.6.3 Bibliotecas de coleccionesPara utilizar un contenedor,bastacon añadirle referenciasa objetos y luego preguntarpor ellas. Dado que el

contenedorsólo guardaobjetosde tipo Object, al añadirleuna referenciase haceun moldeadohaciaarriba a Objectperdiendola identidad.Al recuperarlo,seobtieneuna referenciaa Object y no una referenciaal tipo introducido.Pararecuperarla interfazdel objetointroducidoenel contenedorsedebehacerun moldeadohaciaabajo,a un tipo erróneo,semostrará un error en tiempo de ejecución, exception.

Para solucionar el moldeado hacia abajo y las comprobacionesen tiempo de ejecución, se crean los tiposparametrizados,que son clases que el compilador puede adaptar automáticamentepara que trabajen con tiposdeterminados.DadoqueC++ no tiene jerarquíade raíz únicaesla soluciónqueadopta(template).Javano los tienenyaque logra lo mismo explotando la unicidad de raíz de su jerarquía, aunque lo hace de manera complicada.

1.7 Multihilo

A veces,esnecesariohacerusode lasinterrupcionesparael manejode tareascríticasenel tiempo,perohay unagrancantidadde problemasen los que simplementese intentadividir un problemaen fragmentosde código que puedenserejecutadospor separado,de maneraquese logra un menortiempode respuestaparatodo el programaen general.Estosfragmentosde código quepuedenserejecutadospor separado,sedenominanhilos y el conceptogeneralmultihilo. Loshilos sonunaherramientaparafacilitar la planificaciónde un monoprocesador.Si el sistemaoperativosoportamúltiplesprocesadores,esposibleasignarcadahilo a un procesadordistintodemaneraquelos hilos seejecutenverdaderamenteenparalelo.Uno de los aspectosmás destacableses que el programano tiene de ocuparsede ello. Para los recursoscompartidos por varios hilos se pueden establecer bloqueos a los accesos.

El hilo deJavaestáincluido en el propio lenguajey sesoportaa nivel deobjeto.El bloqueodememoriadecualquierobjetose logra mediantela palabraclave synchronized. Otros tipos de recursosse debenbloquearpor el programadorcreando un objeto que represente el bloqueo que todos los hilos deben comprobar antes de acceder al recurso.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 3

Page 4: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

2. Todo es un objeto

2.1 Los objetos se manipulan mediante referencias

En Java,todosetratacomoun objeto,utilizandounaúnicasintaxisconsistente,queseutiliza entodaspartes.Aunquesetratatodocomoun objeto,el identificadorquesemanipulaesunareferencia a un objeto.Es la referencia,la queactúasobre el objeto.

La referenciapuedeexistir por sí mismasin necesidadde queexistaun objeto.De estaforma, si sedeseatenerunapalabra o frase, se crea una referencia String :

| String s;

Estasentenciasólo creala referencia,no el objeto.Si sedecideenviarun mensajeen estemomento,seobtendráunerrorentiempodeejecuciónporques no seencuentravinculadoa nada.Unaprácticamásseguraesiniciar la referenciaenel mismo momento de su creación:

| String s = “abcd“

Cuandosecreaunanuevareferencia,debeconectarseconun objeto.Javautiliza la palabrareservadanew, paracrearun objeto nuevo.

| String s = new String (“abcd“)

2.2 Donde reside el almacenamiento?

Hay seis lugares diferentes donde almacenar información:

1. Registros. Elementode almacenamientomás rápido.Número limitado de ellos. Los asignael compiladorenfunción de sus necesidades. No se tiene control directo sobre ellos.

2. La pila. Resideen la memoriaRAM, tienesoportedirectodel procesadora travésdel puntero de pila, quesemuevehaciaabajoparacrearmásmemoriay haciaarriba paraliberarla.Estemétodoesuna manerarápidayeficientedeasignarespacio.El compiladordebeconocer,mientrasestácreandoel programa,el tamañoexactoyla vida de todos los datosalmacenadosen la pila. El uso de la pila pone limitacionesde flexibilidad a losprogramas.

3. El Montículo. Espaciodememoriadepropósitogeneral,en el queresidenlos objetosJava.En el montículo,adiferenciade la pila, el compiladorno necesitaconocercuantoespaciode almacenamientosenecesitaasignar.Proporciona gran flexibilidad.

4. Almacenamiento estático: (con una ubicación/posición fija pero en RAM). Contiene datos que están disponiblesdurantetodo el tiempo quese estéejecutandoun programa.Seutiliza static paraespecificarqueun elementoparticular de un objeto sea estático, pero los objetos nunca se sitúan en el espacio de almacenamiento estático.

5. Almacenamiento constante. Los valores constantes se suelen ubicar directamente en el código del programa. Enocasioneslas constantessuelen ser acordonadas por si mismas, de forma que puedan ser ubicadasocasionalmente en ROM.

6. Almacenamiento no-RAM . Los dos ejemplos principalesson: objeto de flujo de datos (stream), que seconvierteen flujo o corrientesdebits, generalmenteparaserenviadosa otramáquinay los objetos persistentes,que son ubicados en disco. Java proporciona soporte para persistencia ligera.

Página 4 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 5: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

2.3 Los tipos primitivos

Los tipos primitivos tienenun tratamientoespecial,no eseficientecrearun objeto de estetipo con new ya que locoloca en el montículo. Para estos tipos se crea una variable automática que no es una referencia.

La variableguardael valor y secolocaen la pila paraqueseamáseficiente.Javadeterminael tamañode cadatipoprimitivo, que no varía de una plataforma a otra:

Tipo primitivo Tamaño Máximo Mínimo Tipo envoltura

boolean - - - Boolean

char 16 bits Unicode 0 Unicode 216 -1 Character

byte 8 bits -128 127 Byte

short 16 bits - 215 +215 -1 Short

int 32 bits - 231 +231 -1 Integer

long 64 bits - 263 +263 -1 Long

float 32 bits IEEE754 IEEE754 Float

double 64 bits IEEE754 IEEE754 Double

void - - - Void

Todoslos tiposnuméricostienensigno.El tamañodebooleanno estáexplícitamentedefinido; sólo seespecificaquedebe ser capaz de tomar los valores True o False.

Los tiposdedatosprimitivos tienentambiénclases“envoltura“, de formaquesi sedeseacrearun objetono primitivoen el montículo para representar ese tipo primitivo, se hace uso del envoltorio asociado. Por ejemplo:

char c = 'x';

Character C = new Character(c);

2.4 Números de alta precisión

Javaincluye dosclasesparallevar a caboaritméticade altaprecisión:BigInteger y BigDecimal. Aunqueestostiposvienen a encajar en la misma categoría de las clases “envoltorio“, ninguna de ellas tiene un tipo primitivo.

Ambasclasestienenmétodosqueproporcionanoperacionesanálogasquesellevana cabocon tiposprimitivos (int yfloat), utilizando llamadas a métodos en lugar de operadores. Son más lentas que las primitivas.

2.5 Arrays en Java

Javagarantizaque los arraysestaránsiempreinicializadosy que no se podrá accedermás allá de su rango. Lacomprobaciónderangosseresuelveconunapequeñasobrecargadememoriaencadaarray,ademásdeverificar el índiceen tiempo de ejecución.

Cuandosecreaunarraydeobjetos,seestácreandorealmenteun arraydereferenciasa los objetos,y cadaunadeestasseinicializa con un valor especialrepresentadopor la palabraclavenull. Debeasignarseun objetoa cadareferenciaantesde usarlay si se intentahacerusode unareferenciaqueaúnvale null, se informaráde queha ocurridoun problemaentiempo de ejecución.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 5

Page 6: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

2.6 Ámbito

Determina tanto la visibilidad como la vida de los nombres definidos dentro de éste ámbito. El ámbito se determina porla ubicación de las llaves {}, por ejemplo:

{

int x=12;

/* sólo x disponible */

{

int q=96;

/* tanto x como q están disponibles */

}

/* sólo x disponible */

/* q está fuera del ámbito o alcance */

}

Una variabledefinidadentrode un ámbito solamenteestádisponiblehastaque finalice su ámbito.La visibilidad enJavaestá implementadaen modo de anidamientodescendente.Si una variable se define en un determinadonivel, yposteriormente en un nivel inferior, el compilador comunicará que la variable está duplicada.

{

int x;

{ int x; }

}

2.7 Ámbito de los objetos

Los objetosno tienenla mismavida quelos tiposprimitivos. Cuandosecreaun objetoconnew, ésteperdurahastaelfinal del ámbito, de manera que:

{

String s = new String (“un string “);

/* fin del ámbito */

}

La referencia s desaparece al final del ámbito, sin embargo, el objeto String al que apunta s sigue ocupando memoria.

Javatiene un recolector de basura, que recorretodoslos objetosquefueron creadoscon new y averiguacualesnoseránreferenciadosmás, liberando la memoriaque estosocupan.En Javano es necesariohacerningunareservadememoria,simplementesecreanlos objetosy cuandodejande sernecesarios,desaparecenpor sí mismos.Estoelimina elproblemadeprogramacióndenominado“agujerodememoria“,queseproduceenotroslenguajescuandono sedestruyenexplícitamente los objetos para liberar memoria.

2.8 Crear nuevos tipos de datos: clases

Un nuevotipo deobjetosedefinemediantela palabraclaveclass, quesiempreva seguidadel nombredel nuevotipo,por ejemplo:

class UnNombreDeTipo {/* Aquí va el cuerpo de la clase */}

Esto introduce un nuevo tipo, siendo posible crear un objeto de este tipo haciendo uso de la palabra new, por ejemplo:UnNombreDeTipo u = new UnNombreDeTipo ();

2.9 Campos y métodos

Cuando se define una nueva clase, es posible poner dos tipos de elementos:� datos miembros (denominados campos)� funciones miembros (denominados métodos).

Un datomiembroesun objetode cualquiertipo con el quete puedescomunicara travésde su referencia.Tambiénpuedeseralgúntipo primitivo. Si esunareferenciaa un objeto,hayquereinicializaresareferenciaparaconectarlaaalgúnobjetoreal (utilizando new) en unafunción especialdenominadaconstructor. Si se tratade un tipo primitivo esposibleinicializarladirectamenteenel momentodedefinir la clase.Cadaobjetomantieneel espaciodealmacenamientonecesariopara todos sus datos miembro; estos no son compartidos con otros objetos:

class SoloDatos

{

Página 6 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Ilegal

Page 7: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

int i;

float f;

boolean b;

}

Es posible asignar valores a los datos miembro, pero primero es necesario hacer referencia al miembro del objeto. s.i = 47;

s.f = 1.1f;

f.b = False;

Tambiénes posible que un objeto puedacontenerotros datosque se quieranmodificar. Paraello hay que seguirconcatenando puntos por ejemplo:

miAvion.TanqueIzquierdo.capacidad = 100;

2.10 Valores por defecto para los miembros primitivos

Cuandoun tipo de datosprimitivo esun miembrode una clase,segarantizaquetengaun valor por defectosi no seinicializa:

TipoPrimitivo

Valor pordefecto

TipoPrimitivo

Valor pordefecto

boolean false

char u0000 (null)

byte (byte) (0)

short short (0)

int 0

long 0L

float 0.0f

double 0.0d

Estagarantíano seaplica a lasvariables“locales“ -- aquellasqueno seancamposdeclases.Si dentrodeunafunciónse tiene: int x; entonces x tomará algún valor arbitrario. El compilador Java advierte como error de esta circunstancia.

2.11 Métodos, parámetros y valores de retorno

LosmétodosenJavadeterminanlosmensajesquepuederecibir unobjeto.Laspartesfundamentalesdeun métodosonsu nombre, sus parámetros, el tipo de retorno y el cuerpo. Su forma básica se asemeja a la siguiente:

tipoRetorno nombreMetodo ( /* lista de parámetros */ )

{ /* cuerpo del método */ }

El tipo deretornoesel tipo devalor quesurgedel métodotrasserinvocado.La lista deparámetrosindica los tiposynombresde las informacionesqueesnecesariopasarenesemétodo.Cadamétodoseidentificaunívocamentemedianteelnombre del método y la lista de parámetros.

En Java,los métodospuedencrearsecomopartedeunaclase.Es posiblequeun métodopuedaserinvocadosóloporun objeto,quellevaráa cabola llamadaal método.Un métodopuedeinvocarsemediantela expresióncompletadesu rutacualificada,o bien, asignandoa unavariableel valor de retornode un objeto,en estecaso,la declaraciónde la variabledebe corresponderse con el valor que retorna el método.

El acto de invocar a un método suele denominarse envío de un mensaje a un objeto. Por ejemplo en:

int x = a.f(x);

el mensaje es f() y el objeto es a.

2.12 Lista de parámetros

La lista deparámetrosdeun métodoespecificala informaciónquesele pasa.Estainformacióntieneformadeobjetoysedebeespecificarlos tiposdeobjetosa pasar,y nombrea utilizar encadauno.Debetenerseencuentaquerealmentenose están manipulando directamente objetos, sino que se están pasando referencias. Un método puede devolver el tipo que sedesee, pero si no se desea devolver nada, se debe indicar que el método devuelve void

Cuandoel tipo de retornoes void, seutiliza la palabraclave return sólo parasalir del método,siendoinnecesariacuandose llega al final del mismo.Es posiblesalir de un métodoen cualquierpunto,pero si se devuelveun valor deretorno distinto de void, el compilador obligará a devolver el tipo apropiado (mediante mensaje de error).

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 7

Page 8: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

2.13 Construcción de un programa en Java

2.13.1 Visibilidad de nombresParaproducir un nombreno ambiguopara una biblioteca,el identificadorutilizado se asemejaa los nombresde

dominiodeInternet, peroa la inversa,dadoqueesposiblegarantizarqueestosseanúnicos.Unavezquesedala vueltaalnombrede dominio, los nombressupuestamenterepresentandirectorios.Este mecanismohace posible que todos susficheros residan automáticamenteen sus propios espaciosde nombres,y cada clase de un fichero debe tener unidentificador único.

2.13.2 Utilización de otros componentesCuandosedeseeutilizar unaclasepredefinidaenun programa,el compiladordebesaberdondeencontrarla.Paraello,

debeutilizarsela sentenciaimport . Estapalabraclavele diceal compiladorquetraigaun paquete, queesunabibliotecadeclases.

La mayoríade lasvecesseutilizan componentesdebibliotecasdeJavaestándarquevienenconel propiocompilador,simplemente se hace:

import java.util.ArrayList;

paraindicaral compiladorquesedeseautilizar la claseArrayList deJava.Sin embargo,util contienebastantesclasesy sepodríadesearutilizar variasde ellassin tenerquedeclararlastodas.Estose logra sencillamenteutilizandoel * quehace las veces de comodín, así:

import java.util.*;

importaría la colección de clases que forman parte de la librería útil .

2.17.3 La palabra clave staticAl crearunaclaseseestádescribiendoquéaparienciatienensusobjetosy cómosecomportan.No setienenadahasta

crearun objetodeesaclaseconnew, momentoenel quesecreael espaciodealmacenamientoy los métodospasanaestardisponibles.

Hay dos situacionesen las que esteenfoqueno es suficiente.Una es cuandose deseatenersólo un fragmentodeespaciode almacenamientoparaunaparteconcretade datos,independientementede cuántosobjetossecrean,o inclusoaunqueno secreeninguno.La otraescuandosenecesitaun métodoqueno estéasociadoa ningúnobjetoparticulardeunaclase.Puestoque los métodosestáticosno precisande la creaciónde ningún objeto, no puedenaccederdirectamenteamiembros de métodos no estáticos sin referirse al objeto con nombre del que son propiedad.

Paradeclararun datoo un miembroa nivel declasecomoestático,bastaconcolocarla palabraclavestatic antesdeladefinición, así:

class PruebaEstatica {

static int i = 47;

}

Ahora, incluso si se construyendos objetosde tipo PruebaEstatica,sólo habráun espaciode almacenamientoparaPruebaEstatica.i. Ambos objetos compartirán la misma i:

PruebaEstatica st1 = new PruebaEstatica();

PruebaEstatica st2 = new PruebaEstatica();

En este momento, tanto st1.i como st2.i tienen el valor 47, puesto que se refieren al mismo espacio de memoria.

Hay dos manerasde referirsea una variable estática.Es posible manejarlasa travésde un objeto como en st2.i.Tambiénesposiblereferirsea ellasdirectamentea travésdesunombredeclase,algoquenosepuedehacerconmiembrosno estáticos. Ésta manera especial énfasis en la naturaleza estática de esa variable.

PruebaEstatica.i ++;

El operador ++ incrementa la variable. En ese momento tanto st1.i como st2.i valdrán 48.Algo similar seaplicaa los métodosestáticos.Es posiblereferirsea ellos, bien a travésde un objeto o bien con la

sintaxis adicional NombreClase.metodo(). Un método estático se define de manera semejante:

class FunEstatico {

static void incr() {PruebaEstatica.i++}

}

Página 8 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 9: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

Mientrasquestatic al seraplicadoa un miembrode datos,cambiadefinitivamentela manerade crearlos datos(unopor cadaclaseen lugardeunopor cadaobjetono estático),al aplicarsea un métodono estandrástico.Un usoimportantedestatic paralos métodosespermitir invocara un métodosin tenerquecrearun objeto.Esto,esesencialen la definicióndel método main(), que es el punto de entrada para la ejecución de la aplicación.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 9

Page 10: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

3 Controlar el flujo del programa.

3.1 Asignación

La asignaciónde tipos primitivos es sencilla y directa,ya que el dato primitivo albergael valor actual y no unareferenciaa un objeto.En la asignaciónde objetos,sin embargo,cuandosehaceunaasignaciónde un objetoa otro, secopiala referenciade un sitio a otro, esdecir, si sehaceC=D siendoambosobjetos,tantoC comoD apuntaránal objetoqueoriginalmenteapuntabaD. Estefenómenosellamausode alias.El usode aliastambiénseproduceenel pasodeunobjeto a un método, de forma que se pasa una referencia.

3.2 Operadores

Relacionales(<,>,<=...), generanun resultadode tipo boolean, su uso para tipos primitivos es tal cual, pero paracomparar los contenidos de dos objetos (referencias) se debe usar equals.

Lógicos(AND &&, OR ||,NOT !), producenun valor lógico,perosólo esposibleaplicarlosa los valoresboolean. Laevaluaciónde operadoreslógicos sufre cortocircuito, es decir, se evalúansolo hastaque es posible determinarsinambigüedad la certeza o falsedad de toda expresión lógica.

Operadoresdebit. Permitenmanipularbits individuales,los operadoresson AND (&), OR(|),XOR(^), NOT(~); estosoperadoresson combinablescon el de asignación(&=) a excepcióndel operadorNOT. Los tipos booleanse puedenmanipular con estos operadores, pero no se les puede aplicar el operador NOT.

Operadoresdedesplazamiento. Estosoperadoresmanipulanbitsy sólosepuedenutilizar contiposprimitivos enteros.Al desplazarun char será convertido a int y el resultadoserá también un int. Sólo se desplazanlos n-1 bits mássignificativos para evitar salirse de rango.

Operador ternario if-else, tiene la formaexp-booleana ? Valor_0 : valor_1

Si la expresión booleana es cierta se evaluará valor_0, en caso contrario valor_1.Conversión. NormalmenteJavaconviertelos tipos cuandocreeapropiado,y la conversiónesseguraexceptuandolas

conversiones reductoras, en las que se corre el riesgo de perder información.

Página 10 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 11: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

4 Inicialización y limpieza

4.1 Inicialización garantizada con el constructor.

En Java,el diseñadordecadaclasepuedegarantizarqueseinicialice cadaobjetoproporcionandoun métodoespecialllamado constructor. Si una clase tiene constructor,Java lo llama automáticamenteal crear un objeto, quedandolainicialización garantizada. Para evitar conflictos el nombre del constructor es el mismo que el de la clase. Los constructoresno tienen valor de retorno.

El constructorpor defectoesaquélqueno tieneparámetros,y seutiliza paracrearun objetobásico.Si secreaunaclase sin constructores, el compilador siempre creará un constructor por defecto. Sin embargo si se define algún constructor(con o sin parámetros) el compilador no creará uno automáticamente.

4.2 Sobrecarga de métodos

La sobrecargade métodosesesencialparapermitir que seuseel mismonombrede métodoscon distintostipos deparámetros y es esencial para los constructores.

4.2.1 Distinción de métodos sobrecargados.� Orden de los parámetros� Los tipos primitivos sino coincideny se tiene un tipo de datosmenor al parámetrodel método,esetipo se

promociona(a excepciónde char que se promocionaa int). Si el parámetroes mayor se debe convertirexplícitamente sino el compilador mostrará un mensaje de error.

� NO se pueden usar los tipos de valores de retorno para distinguir los métodos sobrecargados.

4.2.2 La palabra clave this.La palabraclave this, que sólo sepuedeusardentrode un método,producela referenciaal objetopor el quese ha

invocadoal método.Si seinvocaa un métodode unaclasedentrodeun métododeesamismaclaseno esnecesariousarthis.

Cuandoseescribenvarios constructoresparauna clase,hay vecesen las que uno quisierainvocar a un constructordesdeotro paraevitar la duplicaciónde código.Esto sepuedelograr utilizando this. Sepuedeinvocara un constructorutilizando this, perono a dos.Además,la llamadaal constructordebeser la primeracosaque sehagao seobtendráunmensajedeerrordel compilador.El compiladorNO permitetampocoinvocaraun constructordesdedentrodeotro métodoque no sea un constructor.

En los métodosestáticosno existela posibilidaddeusarthisya queno sepuedeinvocara métodosno estáticosdesdedentro de métodos estáticos (al revés sí), y se puede invocar a un método estático de la propia clase sin objetos.

4.3 Limpieza.

En Javaexisteel métodofinalize,quesepuededefinir encadaclase,y si el recolectordebasuraestápreparadoparaliberarel espaciodealmacenamientoutilizadopor el objeto,primeroinvocaráa finalize, y sólo recuperarála memoriadelobjetodurantela pasadadel recolectordebasura.Sin embargofinalizeno esensí un destructor,esdecir,si sequierehaceralgunacosacuandofinalice la vida del objetosedebeprogramarfuerade finalize, ya quepuedequeésteno lleguenuncaaejecutarse. La verdadera utilidad de finalize es la verificación de la condición de muerte de un objeto.

4.4 Inicialización de miembros

Las variablesdefinidaslocalmenteen un métododebenestarinicializadas,en casocontrarioseobtendráun error entiempodecompilación.En el casodeatributosde tipo primitivo estono esasíy Javatieneunainicializaciónpor defecto.Al definir unareferenciaa un objetodentrode unaclasesin inicializarla a un nuevoobjeto, la referenciarecibeel valornull .

Si sedefineunaclasey no seinicializa seobtieneunaexcepción.Esposibleinvocara unmétodoparaproporcionarunvalor de inicialización,perosi tieneparámetrosno puedenserde unaclasequeno estéinicializada,el compiladordaríaerror.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 11

Page 12: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

4.5 Inicialización de constructores

Dentrodeunaclaseel ordende inicializaciónlo determinael ordenenquesedefinenlasvariablesdentrode la clase.Lasdefinicionespuedenestardispersasdentrodelasdefinicionesde los métodos,perolasvariablesseinicializanantesdeinvocar a ningún método, incluido el constructor.

Los objetosestáticosse inicializan antesque los no estáticosaunquesólo se haceuna vez, es decir en la primerallamada.

Al aplicarla herenciaseinicializan lasclasesbasesantesquelos constructoresde lasderivadas,y sellamaa la clasebase una vez por cada clase derivada.

Página 12 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 13: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

5. Ocultar la implementación.

5.1 El paquete: la unidad de biblioteca.

Un paquetees lo que seobtieneal utilizar la palabraclave import. Las importacionesproporcionanun mecanismoparagestionarlos espaciosde nombres.Existe la necesidadde controlarlos espaciosde nombresen Java,paratenerlacapacidad de crear un nombre completamente único sin importar las limitaciones de Internet.

Al crearun fichero de códigofuenteen Java,secrealo quecomúnmentesedenominauna unidadde compilación.Cada una de estas unidades tiene un nombre que acaba en .java, y dentro de la unidad de compilación sólo puede haber unaúnica clase pública, sino el compiladordaráerror. El restode clasesde esaunidad de compilaciónquedanocultasalexterior del paquete y son de apoyo para la clase pública principal.

Al compilarun fichero .java, seobtieneun ficherodesalidaquetieneexactamenteel mismonombreconla extensión.class.

Unabibliotecatambiénesun conjuntode ficherosde clase.Cadafichero tieneunaclasequeespública (aunqueno esobligatorio),de formaquehayun componentepor cadafichero.Si sedeseaquelos componentespermanezcanunidosesnecesarioel usodepakageal principio del archivo,enla primer líneaqueno seaun comentario,indicandoqueesaunidadde compilación es parte de un paquete.

A la horadebuscarlosarchivosdeclaseel interpretedeJavaprocedede la siguienteforma.En primerlugarencuentrala variablede entornoCLASSPATH,a partir de estaraíz, tomael nombredel paquetey reemplazacadapuntopor unabarra para generar un nombre relativo a la raíz CLASSPATH y busca los ficheros .class correspondientes.

En casode colisionesde nombresal utilizar import clase.*,el compiladorsequejay sedeberáespecificarcual es laclaseque sequiereusar.Es posibleque existaalgunaunidadde compilaciónsin ningunaclasepública, en estecasoelarchivo se puede llamar como se desee.

5.2 Modificadores de acceso en Java.�

Public: Las declaraciones del miembro estarán disponibles a todo el mundo�Private: Nadie, puede tener acceso a ese miembro excepto a través de los métodos de esa clase.�Protected: Como private pero dando acceso a los descendientes por herencia.�Amistoso: Accesopor defecto,permite el accesoa las clasesdel mismo paquete.Si no hay un nombredepaquete explícito se usa el mismo directorio (paquete por defecto).

Ejemplo de acceso a clase con constructor privadoclass sopa {

private sopa () {}

// permite la creación a través de un método estático.

public static sopa hacersopa () {

return new sopa();

}

// Patrón devuelve una referencia

private static sopa sp1=new sopa();

public static acceso () {

return ps1;

}

public void f() {..}

}

public class Almuerzo {

void prueba () {

sopa priv_2 =sopa.hacerSopa();// el uso de sopa priv_2 = new sopa(); dará error

sopa.acceso().f();

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 13

Page 14: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

6. Reutilizando clases

6.1 Herencia

En Javasiempreseestáhaciendoherenciacuandosecreaunaclase,ya queal menosseheredeexplícitamentedeotraclase,se heredaimplícitamentede la claseraíz estándarde Javaobject. Paraheredarse usa la palabraclaseextendsseguidadel nombrede la clasebase.Al hacerestose tienenautomáticamentetodoslos datosmiembroy métodosde laclase base.

Class derivada extends ClaseBase {

...

Lasclasesderivadasy las clasesbasepuedentenerun métodomain cadauna,dehechoestoesinteresanteparapoderrealizar pruebas individuales de las clases, no importa que la clase no sea pública ya que el método main si lo es.

Se debede tenercuidadode hacerlos métodosde la claseextendidapúblicos, sino la herenciasólo es posibleenclasesdel mismo paquete(accesoamistoso).Es posiblesobreescribirlos métodosheredados,en estecasosí queremosreferirnosal métodooriginal (el de la clasebase)se utiliza la palabraclave super (super.metodo).Tambiénse puedenañadir nuevos métodos a la clase derivada.

6.1.1 Inicialización de la clase base.La herenciano esunasimplecopiade la interfazde la clasebase,cuandosecreaun objetode la clasederivada,éste

contienedentro de él un subobjetode la clase base.Es esencialque este subobjetode la clase basese inicialicecorrectamente,paraello Javainsertaautomáticamentellamadasal constructordela clasebaseenel constructordela clasederivada,de forma que se inicializan las clasesbasesantesque los constructoresde la clasederivadapuedanaccederaellos.

En el casode que el constructorde la clasebasetengaparámetrosse debeescribir explícitamentela llamadaalconstructordela clasebasemediantesupery la lista deparámetrosapropiada.Ademásdebeserlo primeroquesehagaenel constructorde la derivada.Sino sehaceel compiladorenvíaun error. Dado que no puedeaparecernadaantesde lallamadaal constructordela clasebasenosepodráncapturarexcepcionesenel constructordela derivada,lo queavecesesun inconveniente.

Si unaclaseen Javatieneun nombrede métodosobrecargadovariasveces,la redefiniciónde esenombrede métodoenla clasederivadano escondelasversionesdela clasebase,esdecir,la sobrecargafuncionaigual conindependenciadelnivel de herencia.

6.2 La palabra clave final.

6.2.1 Declaración de datos como final.Si el datoesde un tipo primitivo, seconvierteen constanteen tiempode compilacióny sele debedar un valor en

tiempode la definición.Un campoquesedefinacomoestáticoy final sólo tieneun espaciodealmacenamientoqueno sepuede modificar.

Sinembargocuandodeclaramoscomofinal cualquierobjeto,enrealidadsehacefinal la referenciaa unaconstante,esdecir,unavezquela referenciaseinicializa a unobjeto,éstanuncasepuedecambiarparaqueapuntea otroobjeto,pero,síse puede modificar el objeto en sí:

public class DatosConstantes { DatosConstantes dc1 = new datosConstantes();

... dc1.i1++; // ERROR i1 es constante

final int i1=9; dc1.Val2.i1++; // Referencia constante el objeto no

public static final int VAL =99; dc1.Val2=new Valor(); // ERROR referencia constante

final valor Val2=new Valor(); ...

... ...

Si declaramos un dato como final y no se inicializa hasta el momento de su uso es lo que se conoce como constante blanca,en cualquier caso se debe inicializar antes de su uso y ésto lo garantiza el compilador.

Es obligatorio hacer las asignacionesa constantes,bien en el momento de definición del campo o bien en elconstructor, de forma que se garantice que el campo constante se inicializa siempre antes de ser usado.

Javapermitehacerparámetrosconstantesdeclarándoloscomofinal enla lista deparámetros.Estosignificaquedentrodel método no se puede cambiar aquello a lo que apunta la referencia al parámetro.

Página 14 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 15: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

6.2.2 Declaración de métodos como finalHay dos razonespara justificar los métodosconstates,evitar que las clasesheredadasvaríen su significado y por

motivos de eficiencia. Cualquier método privado de una clase es implícitamenteconstante,no se puedeaccedernimodificar (si se intenta se crea uno nuevo en realidad).

6.2.3 Clases constantesAl definir unaclasecomoconstante(final) seestablecequeno sepuedeheredardeestaclasebienseapor cuestiones

dediseño,seguridado eficiencia.Al definir unaclasecomoconstantetodossusmétodossonimplícitamenteconstantesyaque no se pueden modificar.

6.3 Carga de clases e inicialización.

En generalsepuedeasegurarqueel códigode lasclasessecargaenel momentodesuprimeruso,estonormalmenteocurrecuandose construyeel primer objetode esaclase,pero tambiénse da una cargacuandose accedea un dato ométodoestático.En el momentodel primer uso es tambiéndondese da la inicialización estática.Todos los objetosestáticosy el bloquedecódigoestáticoseinicializanenel ordentextualenel momentode la carga.Los datosestáticosseinicializan solo una vez.

Si se utiliza herenciala clase basese carga con independenciade si se crea un objeto de la clase derivada.Posteriormente se lleva a cabo la inicialización estática de la clase raíz y posteriormente la siguiente clase derivada.

Trascargarlas clasesnecesariassepuedecrearel objeto.Primeroseponea susvalorespor defectotodoslos datosprimitivos y las referencias a objetos se ponen a null. Después se invoca al constructor de la clase base.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 15

Page 16: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

7. PolimorfismoLa conexióndeunallamadaaun métodosedenominaligadura.Cuandoselleva a cabola ligaduraantesdeejecutarel

programa,esdecir,entiempodecompilación,sedenominatemprana.La correspondenciaentiempodeejecuciónsellamaligadura tardía o dinámica. Cuando un lenguaje implementala ligadura tardía, debe haber algún mecanismoparadeterminar el tipo de objeto en tiempo de ejecución e invocar al método adecuado.

Todaligadurade métodosen Javaestardíaexceptoen los métodosconstantes.Estopermiteasegurarel polimorfismoya quesepuedeescribirel códigoquetratala clasebasey saberquetodaslasclasesderivadasfuncionaráncorrectamenteal usar el código.

7.1 Clases y métodos abstractos.

Secreaunaclaseabstractacuandosedeseamanipularun conjuntodeclasesa travésdeun interfazcomún.Todoslosmétodosde clasesderivadasque encajanen la declaraciónde la clasebasese invocaránutilizando el mecanismodeligadura dinámica (si los parámetrosson diferentesse tiene sobrecarga).Toda clase que tenga uno o más métodosabstractosseconsideraabstracta.No esposiblecrearobjetosde una claseabstracta,y si seheredade ella sedebendeproporcionardefinicionesde los métodosque en la clasebaseeranabstractos.Si no sehaceasí la clasederivadaserátambiénabstractay el compiladorobligaráa definirla comotal. Sepuedetenerunaclasecuyosmétodosseannoabstractosy esté definido como abstracto, eso tiene sentido si no se desea que se creen instancias de ellos.

Abstract class claseAbstracta class clasederivadadeAbstracta

.... ....

public abstract void metodoAbstracto(); public void metodoAbstracto ()

public void metodo_no_abstracto() {...}; {//Definición}

.... ....

... ....

7.2 Constructores y polimorfismo

En el constructorde la clasederivadasiempreseinvocaa un constructordela clasebase,encadenandola jerarquíadeherenciasde forma queseinvocaa un constructorde cadaclasebase,despuéssellamaa los inicializadoresdemiembrosen el orden de declaración y finalmente al cuerpo del constructor de la clase derivada.

Al utilizar la herenciay utilizar finalize, sedebesuperponeréstemétodoenla clasederivadasi sequierehaceralgunalimpiezaespecialya quesepuedetenercontrolsobreel ordende finalización.El ordenmásadecuadoesfinalizar primerola clase derivada y después la clase base.

Sinembargo,cuandodentrodeunconstructorseinvocaa unmétododeligaduradinámicadelobjetoqueseconstruye,seutiliza la definiciónsuperpuestadeesemétodo,el efectopuedeserinesperadoy dar lugara erroresdifíciles dedetectar.Esto es así porque se llama a un método que podría manipular miembros que no han sido aún inicializados.

7.2.1 Conversión hacia abajoDado que en la conversiónhacia arriba se pierde información específicade los tipos, tiene sentido hacer una

conversiónhaciaabajosi sequiererecuperarla informaciónde tipos, esdecir, moversehaciaabajopor la jerarquía.Laconversiónhaciaarriba siemprees seguraya que la clasebaseno puedeteneruna interfaz mayor que la derivada,sinembargola conversiónhacia abajo no estátan claro. Paragarantizarlo,Java,realiza una comprobaciónde todas lasconversiones en tiempo de ejecución.

Página 16 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 17: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

8 Interfaces y clases internas

8.1 Interfaces

Mediantela palabraclave abstract, que permite crearuno o más métodossin definición dentro de una clase,seproporcionapartede la interfaz sin proporcionarla implementación,que serácreadapor susdescendientes.La palabraclave interface produceuna clasecompletamenteabstracta,que no tiene ningún tipo de implementación.Una interfazpuedecontenercampos,pero éstosson implícitamenteestáticosy constantes, proporcionandosólo la forma, pero no laimplementación.

Definición de interfaz Implementacióntipo_acceso interfaz nombre { acceso class nombreclase implements nombre

tipo_devuelto metodo1 (parámetro); {

... ....

tipo_var1 = valor; }

}

Acceso public o no se usa. Acceso public o no se usaLas variables son implícitamente final y static Los métodos que implemente la interfaz deben ser publicUn método privado no es parte de la interfaz

8.2 Herencia múltiple

Dado que una interfaz no tiene implementaciónalguna(no tiene espaciode almacenamientoasociado)se puedencombinarvarias interfaces.Sólo se puedeheredardesdeuna claseno interfaz, el resto de elementosbasedebenserinterfaces.

Al implementar múltiples interfaces pueden colisionar nombres de métodos. Al mezclar la sobrecarga,laimplementacióny la superposición,dadoque las funcionessobrecargadasno pueden diferir sólo en el valor de retorno,podemostenererroresdel compilador.Por ello sedebeevitar la utilización de métodoscon los mismosnombresen lasinterfaces.

Una interfaz puede extender otra interfaz o bien puede combinar varias interfaces sin ningún tipo de problema.

8.2.1 Constantes de agrupamientoCualquiercampoque se pongaen un interfaz se convierteautomáticamenteen estáticoy constante, por ello la

interface es una herramienta conveniente para la creación de grupos de valores constantes (tipo enumerado de C).

8.2.2 Inicialización de atributosLos atributosdefinidosen las interfacessonautomáticamenteestáticosy constantes.Estosno puedenseconstantes

blancas, peropuedeninicializarseconexpresionesnoconstantes.Dadoquelos campossonestáticos,seinicializancuandose cargala clasepor primeravez, lo que ocurre cuandose accedea cualquierade los atributospor primeravez. Losatributos aunque no son pare del interfaz se almacenan, sin embargo, en el área de almacenamiento estático de esa interfaz.

Int num = (int)(Mathrandom()*10);// La espresión no es constante pero sería válida en un interfaz

8.2.3 Interfaces anidadasLasinterfacesanidadas,y lasqueno lo son,puedentenervisibilidad públicao amistosay puedenimplementarsecomo

clases públicas, amistosas y privadas. La novedad de las interfaces anidadas es que pueden definirse privadas.

8.3 Clases internas

Es posiblecolocarunadefinición de clasedentrode otra definición de clase,lo que sedenominaclaseinterna. Estopermiteagruparclasesqueestánrelacionadas,ademásde controlarla visibilidad de una con la otra. Las clasesinternastienensurazóndeseral comenzara hacerunaconversiónhaciaunaclasebase(enparticulara unainterfaz).Estoaumentala ocultación de la implementación.

8.3.1 Ámbitos y clases internas en métodosLas clases internas pueden crearse dentro de un método o incluso en un ámbito arbitrario. Las razones son:

�Se implementa una interfaz de algún tipo, de forma que se puede crear y devolver una referencia.�Para crear una clase que no esté públicamente disponible.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 17

Page 18: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

8.3.2 Clases internas anónimasTienen la forma

public class clase1 {

public claseInterna nombre() {

return new claseInterna() {

...

} ;

}

}

Cómo se ve, combina la creación del valor de retorno con la definición de la clase que representa ese valor de retorno yesanónima(no tienenombre).Estecódigocreaun objetodeunaclaseanónimaheredadade claseInterna, a la referenciaque devuelve new se le hace una conversión hacia arriba automáticamentepara convertirla en una referencia aclaseInterna, es decir, se puede considerar una abreviación de:

class miclaseInterna implements claseInterna {

...

}

return new miclaseInterna();

Si se define una claseanónimainternay se deseautilizar un objetodefinido fuera de la claseinternaanónima,elcompilador exige que el objeto externo sea constante.

Una claseinternatieneaccesoautomáticoa los miembrosde la clasecontenedoraya quemantieneunareferenciaalobjeto particular de la clase contenedora que era responsable de crearla.

8.3.3 Clases internas estáticasSi no senecesitaunaconexiónentreel objetodela claseinternay el objetodela claseexterna,sepuedehacerestática

la clase interna. Esto es así ya que una clase interna estática quiere decir:1. No se necesita un objeto de la clase externa para crear un objeto de la clase interna estática.2. No se puede acceder a un objeto de una clase externa desde un objeto de la clase interna estática.3. Las clases interna no estáticas no pueden tener campos, datos o clases internas estáticas.

Las clases internas hacen referencia a la clase externa mediante: claseExterna.this.

8.3.4 ¿Porque las clases internas?Cadaclaseinternapuedeheredarindependientementede una implementación.Por consiguiente,la claseinternano

estálimitada por el hechode quela claseexternapuedeya estarheredandode una implementación.Es decir, las clasesinternas permiten heredar de forma efectiva de más de un no interfaz.

Además se tienen las siguientes características adicionales:1. La claseinternatienemúltiplesinstancias,cadaunaconsuspropiainformacióndeestadoqueesindependientede

la información del objeto de la clase externa.2. En unaclaseexternasepuedentenervariasclasesinternas,cadaunadelascualesimplementanla mismainterfaz

o hereda de la misma clase de distinta forma.3. El momento de la creación del objeto de la clase interna no está atado a la creación del objeto de la clase externa.4. No hay relaciones es – un dentro de la clase interna.

10 Manejo de errores con excepciones.

10.1 Excepciones básicas.

Unacondiciónexcepcionalesun problemaqueevita la continuacióndeun métodoo del alcanceactual,debidoa quenosedisponedela informaciónnecesariaparatratarel problemaenel contextoactual. Todolo quesepuedehacer essalirdel contexto actual y relegar el problema a un contexto superior. Esto es lo que ocurre cuando se lanza una excepción:

� Se crea el objeto excepción en el montículo con new.� Se detiene el cauce normal de ejecución y se lanza la referencia al objeto excepción desde el contexto actual.

Página 18 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 19: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

� El mecanismo de gestión de excepciones busca el lugar apropiado donde continuar ejecutando el programa.� Estelugaresel gestordeexcepciones,cuyo trabajoesrecuperarel problemadeformaqueel programapuedao

bien intentarlo de nuevo, o bien simplemente continuar.

ComocualquierobjetoenJavalasexcepcionestienensuconstructor,enel casode las excepcionesestándardos,unopor defecto y otro que toma un parámetro string de forma que pueda ubicar la información pertinente en la excepción.

Trascrearel objetoexcepción(new) sele daa throw la referenciaresultante.Ademássepuedelanzarcualquiertipode objetoThrowable quesedesee.Habitualmenteselanzaráunaclasede excepcióndiferenteparacadatipo de error. Lainformaciónsobrecadaerror se representatanto dentrodel objeto excepcióncomo implícitamenteen el tipo de objetoexcepción elegido.

10.2 Capturar una excepción.

Si un métodolanzauna excepción,debeasumirque esaexcepciónserácapturaday tratada.El métodoacabaen elmomentodel lanzamiento,paraevitarlo,sepuedeestablecerun bloqueexcepcionaldentrodel métodoparaquecapturelaexcepción:

try {

// Código que puede generar excepciones

}

Todaexcepciónlanzadadebeacabaren el manejadorde excepciones,hay uno paracadatipo de excepciónque sedeseecapturar.Los manejadoresde excepciónsigueninmediatamenteal bloquetry y seidentificanpor la palabraclavecatch:

try {

// Código que puede generar excepciones

} catch (tipo1 id1) {

// Manejo excepciones tipo 1

} catch (tipo2 id2) {

// Manejo excepciones tipo 2

} catch (tipo3 id3) {

// Manejo excepciones tipo 3

....

}

En estecódigosólo seejecutaunasentenciacatch (no pasacomoen switch que le hacefalta un break). No seestálimitado a las excepcionesestándarde Java,sepuedencrearlas propiasexcepcionesparaindicar un error especial,paraello se debe heredar de un tipo de excepción existente.

10.2.1 La especificación de excepcionesLa especificacióndeexcepcionesutiliza la palabraclaveThrows seguidade todoslos tiposdeexcepciónpotenciales.

No se puedeengañarsobreuna especificaciónde excepciones,si un métodoprovocaexcepcionesy no las maneja,elcompiladorlo detectae indicaqueo biensetratano secolocanen la especificacióndeexcepcionestodaslasexcepcionesque el método puede lanzar. Este sistema permite a Java asegurar la corrección de la excepción en tiempo de compilación.

10.2.2 Captura de cualquier excepción.La clasebasedetodaslasexcepcionesesla claseException (si seusaen unalista debeserla última), paraconseguir

información se puede llamar a los métodos de su tipo base Throwable.String getMessage () : Mensaje

String getLocalizedMessage(): Mensaje ajustado al escenario particular

String toString: Descripción del objeto Throwable

void printStackTrace (): Imprime el objeto y la traza de pila de llamadas

void printStackTrace(PrintStream): Apunta a un flujo de datos

void printStackTrace (PrintWriter)

Throwable fillInStackTrace (): registra la información relativa al estado actual de la pila.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 19

Page 20: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

10.2.3 Relanzar una excepciónSi se desease puedevolver a lanzaruna excepciónque se acabade capturar.Esto haceque la excepciónvaya al

contexto inmediatamentesuperior de manejadoresde excepciones.Cualquier cláusulacatch subsiguientedel mismobloque try seguirá siendo ignorada.

10.3 Excepciones estándar de Java.

Hay un grupode tiposdeexcepcionesqueJavasiemprelanzaautomáticamente,estánagrupadasbajounaúnicaclasedenominadaRuntimeException. Si no se capturan estas excepcionesen tiempo de ejecución, se invoca aprintStackTrace() para esa excepción y el programa finaliza su ejecución.

10.3.1 RestriccionesAl aplicar la herenciaa clasesque tenganexcepciones,el constructorde la clasederivadadebedeclararcualquier

excepcióndel constructorde la clasebaseen su especificaciónde excepciones.El constructorde la clasederivadanopuedecapturarlasexcepcionesdela clasebase.Justoporqueexisteunaespecificacióndeexcepcionesenunaversióndelaclasebasedeun método,no tieneporqueexistir enla versióndela clasederivadadel mismo,estoesdistintoa lasnormasgenerales de la herencia.

Página 20 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 21: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

11 El sistema de E/S de Java

11.1 La clase file

La clasefile puederepresentarel nombrede un archivoparticular,o los nombresde un conjuntode archivosde undirectorio.Si setratadeun conjuntodearchivos,sepuedepreguntarpor el conjuntoconel métodolist(), quedevuelveunarray de strings.

Tambiénsepuedeusarun objetoFile paracrearun nuevodirectorioo unatrayectoriade directorioscompletasi estano existe. Tambiénse puedenmirar las característicasde archivos,ver si es objeto File representaun archivo o undirectorio, y borrar un archivo.

11.2 Entrada y Salida

LasbibliotecasdeE/S usana menudola abstraccióndel flujo, querepresentacualquierfuenteo consumidorde datoscomoun objetocapazdeproduciro recibir fragmentosdecódigo.El flujo ocultalosdetallesdelo queocurreconlos datosen el dispositivo de E/S real.

Todo lo quederivade las clasesInputStream o Reader tieneel métodobásicoRead() paraleer y lo quederivadeOutputStream o Writer tieneel métodoWrite(). Aunquepor lo generalno seusanya quea travésdeotrasclases(quesílos usan) se aplican objetos por capas que proporcionan una funcionalidad final mayor.

11.2.1 Tipos de InputStreamEl trabajo de InputStream es representar las clases que producen entradas desde distintas fuentes:

� Un array de bytes� Un objeto string� Un archivo. � Una tubería.� Una secuencia de otros flujos que se agrupan todos en uno� Otras fuentes, como una conexión a Internet.

11.2.2 Tipos de OutputStreamEstacategoríaincluyelasclasesquedecidendondeirá la salida.Un arraydebytes,un ficheroo unatubería.No puede

ser un String.

11.2.3 Leer de un InputStream con un FilterInputStream.Las clases de FilterInputStream son:

� DataInputStream: Permite leer tipos de datos primitivos (readByte(), readFloat()...) además de objetos String.� BufferedInputSream: Seusaparaevitar una lecturacadavez quesesolicitannuevosdatos,esdecir, creaun

espacio intermedio.� LineNumberInputStream: Mantieneun seguimientode los númerosde línea en el flujo de datosde entrada.

Puede llamar a getLineNumber() y a SetLineNumber(int).� PushbackInputStream:Tiene un espaciode almacenamientointermediode un byte parael último caráctera

leer.

11.2.4 Escribir un OutputStream con FilterOutputStream.Las clases son:

� DataOutpuStream: Da formatoa losdatosprimitivos y objetosstring,convirtiéndolosenun flujo deformaquecualquier DataInputStream los pueda leer.

� PrintStream: Produce salida formateada, maneja la visualización.� BufferedOutputStream: Se usa para evitar una escritura física cada vez que se envía un paquete de datos.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 21

Page 22: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

11.3 E/S estándar.

El términoE/Sestándarhacereferenciaal flujo deinformaciónqueutiliza todoprograma,deformaquetodaentradaysalidafluye por la E/S estándar,mientrasque todossusmensajesde error se envíana la salidade error estándar.Estoproporcionala posibilidadde encadenarprogramasde modoque la salidade uno seconviertaen la entradaestándardelsiguiente.

SiguiendoestemodeloJavatieneSystem.in, System.out y System.err. La claseSystemdeJavapermiteredirigir losflujos de entrada, salida y error haciendo uso de las llamadas a los métodos estáticos setIn(InputStream),setOut(PrintStream) y SetErr(PrintStream).

11.4 Compresión.

La biblioteca de E/S de Java contieneclasesque dan soportea la lectura y escriturade flujos en un formatocomprimido. Estas clasesestán envueltasen torno a las clasesE/S existentespara proporcionar funcionalidaddecompresión.Sin embargo,no derivan de Reader y Writer, sino que son parte de las jerarquíasInputStream yOutputStream. Esto se debe a que la biblioteca de compresión funciona con bytes en lugar de caracteres.

Las clases de compresión son:� CheckedInputStream: La función GetCheckSum()produce una suma de comprobación de cualquier

InputStream.� ChekedOutputStream: La función GetCheckSum()produce una suma de comprobación de cualquierOutputStream.� DeflaterOutputStream:Clase base de las funciones de compresión.

� ZipOutputStream: DeflaterOutputStream que comprime datos a formato de archivos ZIP.� GZipOutputStream: DeflaterOutputStream que comprime datos a formato de archivos GZIP.� InflaterItputStream:Clase base de las funciones de descompresión.� ZipInputStream: InflaterInputStream que descomprime datos a formato de archivos ZIP.� GZipInputStream: InflaterInputStream que descomprime datos a formato de archivos GZIP.

11.4.1 Archivos Java (JAR).El formatoZIP tambiénseusaenel formatoJAR; queesunaformadecoleccionarun grupodearchivosenun único

archivo comprimido, con la diferencia de que los ficheros JAR son multiplataforma.LosarchivosJAR sonparticularmenteútilesal trabajarconInternetya quepermitecargardeformaconjuntatodoslos

archivos que conforman un applet. Mediante estos archivos la carga es más rápida y además soporta firmas digitales.Un archivo JARconstadeun únicoarchivoquecontieneunacoleccióndearchivosZIP junto conunadeclaraciónque

los describe. La utilidad jar comprime automáticamente los archivos que se seleccionan.jar [opciones] [manifiesto] destino archivo(s) Entrada

Las opciones son:�c: Crear archivo nuevo o vacío.�t: Lista la tabla de contenidos.�x: Extrae todos los archivos�xfile: Extrae el archivo nombrado�f: Indica que se va a dar nombre al archivo�m: Indica que el primer parámetro será el nombre de un archivo de declaración creado por el usuario�v: Genera una salida que describe que va haciendo JAR�O: Sólo almacena los archivos no los comprime�M: No crear automáticamente un archivo de declaración

Mediante jar no se puede añadir o actualizar archivos de uno ya existentes, tampoco se pueden mover.

11.5 Serialización de objetos

La serializaciónde objetos de Java permite tomar cualquier objeto que implementela interfaz Serializable yconvertirloenunasecuenciadebits quepuedeserrestauradaparagenerarel objetooriginal.El mecanismodeserializacióncompensa automáticamente las diferencias entre sistemas operativos.

La serializaciónde un objetoes bastantesimple, siempreque el objeto implementela interfaz serializable (que notiene métodos). Para serializar un objeto, se crea algún tipo de objeto OutputStream y se envuelve en unObjectOutputStream. En estemomentose invoca writeObject() y el objetoseserializaenviándoseal OutputStream.

Página 22 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 23: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

Parael procesoinverso, se envuelveun InputStreamen un ObjectInputStream y se invoca a readObject(), comodevuelveun Object, normalmentese deberáhaceruna conversiónhaciaabajo,por ello una vez recuperadoun objetoserializado, hay que asegurarse que la JVM pueda encontrar su clase, bien en el path o cualquier otro lugar especificado.

Sepuedecontrolarla serializaciónimplementandola interfazExternalizable queextiendeSerializable añadiendodosmétodos: writeExternal() y readExternal().

Cuandoseestácontrolandola serialización,puedeocurrir quehayaun subobjetoenparticularqueno sedeseequesesalvey recuperede formaautomática.Porejemplo,si contieneinformaciónsensible(contraseñas).Paracontrolaresto,sepuededesactivarla serializaciónen una basecampo-a-campomediantela palabraclave trasient. Esto indica que no sedebe guardar o recuperar ese dato en la serialización:

acceso trasient tipo nombre

11.6 Identificar símbolos de una entrada

LasdosclasesdeJavaparadividir lassecuenciasdecaracteresenunasecuenciadesímbolossonStreamTokenizer yStringTokenizer.

11.6.1 StreamTokenizerStreamTokenizerno derivade InputStreamni de OutputStream,sólo funcionacon objetosInputStream,por lo que

pertenecea la partede E/S de la biblioteca.Estaclasedivide el flujo de entradaen Tokens que estándelimitadosporconjuntos de caracteres.

11.6.2 StringTokenizerEstaclasefacilita el análisissemánticodeun flujo deentrada,y devuelvetodoslos símboloscontenidosenunacadena

decaracteresdeuno enuno,estossímbolossonlos caracteresconsecutivosdelimitadospor tabuladores,espaciosy saltosde línea.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 23

Page 24: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

13 Crear ventanas y applets

13.1 Applet básico

13.1.1 Restricciones de los applets� Un applet no tiene acceso al disco local� El tiempo de ejecución aumenta ya que se debe descargar.� Con los applets de confianza firmados digitalmente se suavizan las restricciones de acceso.

13.1.2 Ventajas de los applets.� No precisan instalación, siendo independiente de la plataforma� No hay peligro de que un código erróneo cause daño a la máquina.

13.1.3 Marcos de trabajo de la aplicaciónLasbibliotecasseagrupandependiendodesufuncionalidad,o bienparafacilitar la construccióndeotrasclases.Cierta

categoríade biblioteca es el marco de trabajode aplicación,cuya meta es ayudaren la construcciónde aplicacionesproporcionandounaclaseo un conjuntodeclasesqueproducenel comportamientobásicodeseadoparatodaaplicacióndeun tipo particular.Paraadaptarel comportamientoa las necesidadesparticularessedebeheredarde la claseaplicaciónysuperponer los métodos que interesan.

Los appletsseconstruyenutilizando un marcode trabajode aplicación.Seheredade JApplet y sesuperponenlosmétodos apropiados. Los métodos que controlan la ejecución y creación de un applet son:

� init (): se invocaautomáticamenteparalograr la primerainicializacióndel applet,incluyendola disposicióndecomponentes. Siempre se superpone.

� start(): Seinvocacadavez quesevisualizaun appleten el navegadorparapermitirle empezarsusoperacionesnormales. Se invoca tras init().

� stop(): Es invocadocadavez que el appletse apartade la vista de un navegadorweb. Se invoca antesquedestroy().

� destroy(): Se invoca cuando se descarga el applet para liberar recursos.

13.1.4 Ejecución de applets dentro de un navegador.Los applets se deben de ejecutar en una página web. La sintaxis de una etiqueta APPLET estándar es:

<APPLET

CODEBASE = urlBasecódigo

CODE = archivoClassApplet

ALT= texto alternativo si el navegador entiende la etiqueta APPLET pero no puede ejecutarla.

NAME=nombreinstanciaApplet

WIDTH= pixels HEIGHT= pixels

ALING= tipoAlineamiento

>

<PARAM NAME= nombreAtributo_1 VALUE = valorAtributo_1>

<PARAM NAME= nombreAtributo_2 VALUE = valorAtributo_2>

....

<PARAM NAME= nombreAtributo_n VALUE = valorAtributo_n>

</APPLET>

Página 24 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 25: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

14 Hilos múltiplesPuedesernecesarioconvertirun programaen subtareasseparadasqueseejecutenindependientemente.Cadaunade

estassubtareasrecibeel nombredehilo. Un procesoesun programaenejecuciónautocontenidoconsupropioespaciodedirecciones.Un sistemaoperativomultitareaescapazde ejecutarmásde un procesoa la vez,proporcionándoleciclos deUCP periódicamente. Por consiguiente, un único proceso puede tener múltiples hilos ejecutándose concurrentemente

14.1 Creando hilos con Thread.

La forma mássimpledecrearun hilo esheredarde la claseThread,quetienetodo lo necesarioparacrearo ejecutarhilos. El métodorun debesersobreescritoparaqueel hilo hagalo deseado,esdecir esel códigosimultáneode los hijos.El método start de la clase Thread lleva a cabo alguna inicialización especial para el hijo y después llama a run().

El ordencon el quela UCP atiendea un conjuntodehilos esindeterminado,a menosquesecambienlasprioridadeshaciendousodel métodosetPriority() de Thread.Ademáscuandose creaun Threadno se capturasu referencia,eselpropio hilo el que guarda su referencia de forma que el recolector de basura no pueda limpiarlo.

14.2 Crear hilos con Runnable.

Para poder combinar la clase principal del programacon un hilo se le debe añadir al primero funcionalidadesadicionales,estoseconsiguemediante la interfazRunnable.El usoprograma/hilono estanobvio, cuandoseempiezaelprograma se crean un objeto que es Runnable, pero no se arranca el hilo. Esto hay que hacerlo explícitamente:

hilo_propio= new Thread (nombreclase.this); // nombreclase implementa Runnable

Cuandoalgo tiene una interfaz Runnable,simplementesignifica que tiene un métodorun() (pero sin propiedadescomocuandoseheredade Thread).Por lo tanto,paraproducirun hilo a partir de un objetoRunnable,hay quecrearunobjetoThreadseparado,pasándoleel objetoRunnableal constructorThreadespecial.Despuéssepuedellamaral métodostart() de ese hilo, que lleva a cabo la inicialización y llama a run()

hilopropio.start();

14.3 Hilos demonio

Un hilo demonioesaquélquesupuestamenteproporcionaun serviciogeneralen segundoplanomientrasqueseestáejecutandoel programa,no siendoparte esencialdel programa.Por consiguiente,cuandotodos los hijos no demonioacaban,se finaliza el programa.Se puedesabersi un hilo es demoniollamandoa isDeamon(), y se puedeactivar odesactivarel funcionamientocomodemoniode un hilo con setDeamon. Si un hilo esdemonio,todoslos hilos quecreenserán demonios.

14.4 Compartir recursos

Conla capacidadmultihilo existela posibilidaddequedoso máshilos tratende usarel mismorecursolimitado a lavez.Hay queprevenirlascolisionespor un recurso.Paraello Javatieneintegradoun soporteparaprevenirlascolisionesdeaccesoa un recurso,esteesdeclararel métodoqueaccedeal mismocomosynchronized. Sóloun hilo puedeinvocaraun método synchronized en cada instante para cada objeto.

Acceso synchronized tiporetorno método (parámetros) {

// Zona sincronizada

....

}

Las seccionescríticastambiénse puedenutilizar paraespecificarel objeto cuyo bloqueose usaparasincronizarelcódigo adjunto:

synchronized (objetoSincronizado) {

....

// A este código sólo puede acceder un Thread

}

14.5 JavaBeans

Cuando se crea un Bean, hay que asumir que se ejecutará en un entorno multihilo. Esto significa:1. Siempre que sea posible sus métodos public deberían ser synchronized.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 25

Page 26: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

2. Al dispararun eventomultidifusión a un conjuntode oyentes,hay que asumirque sepodríaañadiro eliminaroyentes de la lista al recorrerla.

14.6 Bloqueo

Un hilo puede estar en uno de los siguientes estados:1. Nuevo: El hilo se ha creado pero no se ha arrancado.2. Ejecutable: El hilo puede ponerse en ejecución cuando le sea asignada la UCP3. Muerto: Al finalizar su método run(). Si se hace llamando a stop se produce una excepción.4. Bloqueado: Hay algo que evita que se ejecute el hilo.

14.6.1 BloqueándoseUn hilo puede estar bloqueado por:

Se ha puesto a dormir con sleep Se ha suspendido con suspend, no se reanuda hasta recibir resume() (en desuso para Java 2). Sesuspendecon wait(). No se reanudahastarecibir notify() o notifyAll(). En estecasose liberan los objetos

synchronized que podría estar usando el hilo. El hilo está esperando que se complete una E/S. El hilo está intentando acceder a un método synchronized usado por otro.

Se puede llamar a yield() para ceder voluntariamente la UCP para que se ejecuten otros hilos.

Página 26 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 27: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

15 Computación distribuida

15.1 Programación en Red.

15.1.1 Identificar una máquina.Paraidentificar de forma unívocaunamáquinaseutiliza el nombrede dominio DNS o un cuartetode trescifras, en

amboscasosla direcciónIP serepresentainternamentecomounnúmerode32 bits,y sepuedelograrun objetoJavaquelorepresenta, usando el método static InetAdress.getByName() se obtiene un objeto de tipo InetAddress:

InetAddress Val = InetAddress.getByName (args[0]);// Args[0] es el nombre de la máquina

// Si args[0]= null, se consigue LocalHost

Unamáquinaseidentificaconla direcciónIP y por el puerto,por ello cuandoseestableceun clienteo un servidorhayqueelegirun puertoenel quetantoel clientecomoel servidoracuerdenconectarse.Los serviciosdel sistemasereservanel uso de los puertos 1 a 1024.

15.1.2 SocketsEl socketes la abstracciónsoftwarequeseusapararepresentarlos terminalesde una conexiónentredosmáquinas.

Parauna conexióndadahay un socketen cadamáquina.En Javase creaun socketparahaceruna conexióna la otramáquina,despuéssecreaun InputStreamy un OutputStreama partir del socketparapoder tratar la conexióncomo unobjetoflujo E/S.Hay dosclasesdesocketsbasadosen flujos: un ServerSocketqueusaun servidorparaescuchareventosentrantesy un Socketqueusaun clienteparainiciar unaconexión.Cuandoun clientehaceunaconexión,ServerSocketdevuelvevía accept()un socket, a travésdel queserealizala comunicación.En éstemomentoseusagetInputStream() ygetOutputStream() para producir los objetos InputStream y OutputStream correspondientes a cada Socket.

// servidor // cliente

ServerSocket s= new ServerSocket (PUERTO); .....

try { Socket conectCliente= new Socket(addr, Puerto);

// Bloqueado esperando conexión ...

Socket conect = s.accept(); try {

.... .....

} finally { } finally {

// Cierra la conexión // Cierra la conexión

s.close(); conectCliente.close();

} }

.... ....

15.1.3 Objeto URL.Dado que todos los navegadoresutilizan URL, existe en Javauna clasedel mismo nombreque proporcionauna

interfaz API simple y concisa para acceder a información a través de Internet. El constructor más usado es:URL(URL objeto_URL, String especificación_URL);

que nos permite relacionarlo con la clase applet:URL url = new URL (getDocumentBase(), “pagina.html”);

getAppletContext().showDocument(url);

AppletContext esuna interfazquenosproporcionainformacióndesdeel entornode ejecucióndel Applet, dentrodeun Applet, y una vez se ha obtenido su contexto, se puede visualizar otro documento llamando a ShowDocument().

Del objetoURL sepuedeobtener,porun ladoel directoriodondecuelgael ficheroclasedeApplet congetCodeBase()y el directorio donde está el fichero HTML (y su nombre) desde el que arranca el applet.

15.2 Conectividad a Base de Datos de Java (JDBC).

JDBCpermitea Javaconstruiraplicacionesde basesde datosclientes/servidorindependientesde la plataforma.Paraapoyarestasfuncionesesinteresanteutilizar exclusivamenteidentificadoresdetiposSQL genéricos.Paratrabajarconunabasede datosen un principio nos debemosconectar,crear unassentencia,ejecutarla petición y accederal conjuntoresultado.

Para abrir una base de datos hay que crear un URL de base de datos que especifica:1. Que se está utilizando JDBS con “jdbc”.2. El subprotocolo, nombre del control de la conexión (por ejemplo “odbc”).

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 27

Page 28: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

3. Identificadorde la basede datos,varíaen función del controladorde basede datos,esun nombrelógico queesasociado por el administrador de base de datos a un directorio físico donde se hayan los datos.

Así por ejemplo:String dbURL = “jdbc:odbc:pepe”;

Class.forName (“sun.jdbc.odbc.JdbcOdbcDriver”);// Carga del controlador.

Connection c = DriverManager.getConnection (dbURL, usuario, contrasenya);

/* Este método estático es el que conecta con la base de datos. Devuelve un objeto tipo

connection que se usará para consultar la base de datos */

Statements = c.createStatement();//Se crea un estamento que permite hacer las consultas.

ResultSet r= s.executeQuery (CONSULTA_SQL); // Es un iterador

while (r.next()) {

r.getString(campo)...// Usa getInt(), getString(), getFloat()... dependiendo del tipo esperado

s.close();

15.3 Servlets

Losservletsproporcionanunasoluciónexcelenteparasoporteenel ladoservidor.La arquitecturadel API servletesladeun proveedordeserviciosclásicoconun métodoservice() a travésdel cualseenviarántodaslaspeticionesdel clienteporpartedel softwarecontenedordel servlet,y los métodosdel ciclo devida init() y destroy(), queseinvocansólocuandose carga y descarga el servlet.

public interface Servlet

public void init (ServletGetConfig config) Throws ServletException;

public ServletConfig getServletConfig();

public void Service (ServletRequest req, ServletResponse res) Throws ServletEsception, IOException

public String getServletInfo();

public void destroy();

El propósitodegetServletConfig() esdevolverun objetoServletConfig quecontienelos parámetrosdeinicializaciónyarranquedel servidor.El métodosetServletInfo() devuelveunacadenade caracteresque contieneinformaciónsobreelservlet, como el autor, versión etc.

El atributo más convenientede la API de servletslo constituyenlos objetosauxiliaresque vienen con la claseHttpServlet (que es extensión de GenericServlet) para darle soporte.

El servletseinicializa llamandoal métodoinit(), al cargarel servidortrasarrancarpor primeravezel contenedordeservlets.Cuandoun cliente haceuna petición a una URL que resultarepresentarun servlet,el contenedorde servletsintercepta la petición y hace una llamada al método service(), tras configurar los objetos HttpServletRequest yHttpServletResponse (que son extensiones de ServletRequest y ServletResponse).

15.3.5 Gestionar sesiones con servlets.HTTP esun protocolosin sesión,de formaqueno sepuededistinguirentreunapersonaqueaccederepetidamenteal

sitio, y otrapersonadiferente.Unadelassolucionesaportadassonlas cookies, quesonunapequeñapiezadeinformaciónenviadapor un servidorweb a un navegador.El navegadoralmacenala cookieen el disco local y cuandosehaceotrallamadaal URL asociadoa la cookie,éstaseenvíajunto con la llamada,proporcionandoasíquela informacióndeseadavuelva al servidor.

El API servletproporcionala claseCookie. Estaclaseincorporatodoslos detallesde cabeceraHTTP y permiteelestablecimiento de varios atributos de cookie. Para usarlas se añaden al objeto respuesta.

Cookie oreo = new Cookie (“una”, “2000”); // Una es el nombre y 2000 el valor.

res.addCookie(oreo);

String valor= getValue(“una”);

15.3.4 La clase SessionUnasesiónesunao mássolicitudesdepáginaspor partede un clientea un sitio webduranteun periododefinido de

tiempo.Un objetoSessionServlet vive en la parteservidoresdel canalde comunicación;sumetaescapturardatosútilessobre ese cliente a medida que el cliente recorre e interactúa con el sitio web.

La clasesession del API servletusala palabraCookieparahacersutrabajo,sin embargo,todoobjetoSession necesitaalgún tipo de identificador único almacenado en el cliente y que se pasa al servidor.

15.4 Java Server Pages

LasJavaServerPages(JSP)sonunaextensióndel estándarJavadefinidosobrelasextensionesde sevlets.El objetivode JSP es la creación simplificada de páginas web dinámicas, al combinar HTML con Java en el mismo documento.

Página 28 J.M. Godoy, F. Gómez y E. Rubio. 2002-2003

Page 29: 1. Introducción a los objetos · Sistemas Informáticos I (Ingeniería Informática. UNED) 1. Introducción a los objetos 1.1 Todo objeto tiene una interfaz. La creación de tipos

Sistemas Informáticos I (Ingeniería Informática. UNED)

El códigoJavaestárodeadode etiquetasespecialesqueindicanal contenedorde JSPquedeberáusarel códigoparagenerar un servlet o parte de uno.

La primeravez que el contenedorde JSPcargaun JSPse genera,compila y cargaen el contenedorde Servletselcódigoservletnecesarioparacumplimentarlas etiquetasJSP.Las porcionesestáticasde la páginaHTML se producenenviandoobjetosString estáticosa write(). Las porcionesdinámicasseincluyendirectamenteen el servlet.HastaqueelcódigoJSPdela páginano semodifique,secomportacomosi fueraunapáginaHTML estáticaconservletsasociados.Sise codifica, se recompila y recarga automáticamente la siguiente vez que se solicite esa página. Las etiquetas JSP son:

< % código JSP %>

Las directivas son mensajes al contenedor de JSP y se delimitan por @<%@ directiva { atributo = “valor”} * %>

No envían nada al flujo Out, permiten configurar atributos y dependencias.

15.5 RMI (Remote Mode Invocation).

RMI haceun usointensivodelasinterfaces.Cuandosedeseacrearun objetoremoto,seenmascarala implementaciónsubyacentepasandouna interfaz.Por consiguiente,cuandoel cliente obtieneuna referenciaa un objeto remoto,lo queverdaderamentelogra esunareferenciaal un interfaz,queresultaestarconectadoa algúnfragmentode código local. Alcrear una interfaz remota hay que seguir ciertas normas:

Debe ser public.Debe extender la interfaz java.rmi.Remote.Cada uno de sus métodos debe declarar java.rmi.RemoteException en su cláusula Throws.Todoobjetoremotopasadocomoparámetroo valor deretornodebedeclararsecomola interfazremota,no comola clase implementation.

J.M. Godoy, F. Gómez y E. Rubio. 2002-2003 página 29