Estructura de Datos - Joyanes

Embed Size (px)

Citation preview

  • capitulo 2tipos de datos: Clases y objetos

    ObjetivosCon el estudio de este captulo usted podr:

    Definir lo que es un tipo de datos. Conocer los tipos de datos bsicos. Conocer los tipos de datos estructurados. Especificar los tipos abstractos de datos. Entender el concepto de encapsulacin de datos a travs de las clases. Definir las clases como una estructura que encierra datos y mtodos. Especificar tipos abstractos de datos a travs de una clase. Establecer controles de acceso a los miembros de una clase. Identificar los miembros dato de una clase como la representacin de las propiedades de un objeto. Identificar los mtodos de una clase con el comportamiento o funcionalidad de los objetos.

    Contenido2.1. Abstraccin en lenguajes de programacin.2.2. Tipos abstractos de datos.2.3. Especificacin de los TAD.2.4. Clases y objetos.2.5. Declaracin de una clase.2.6. Paquetes.2.7. Constructores.

    2.8. Recoleccin de objetos.2.9. Objeto que enva el mensaje: this.2.10. Miembros static de una clase.2.11. Clase Object.2.12. Tipos abstractos de datos en Java.RESUMENEJERCICIOSPROBLEMAS

    Conceptos clave Abstraccin. Componentes. Constructores. Encapsulacin. Especificadores de acceso: public, protected, private.

    Interfaz. Ocultacin de la informacin. Reutilizacin. Software. Tipos de datos y variables.

    Para profundizar (pgina web: www.mhe.es/joyanes) Aplicacin del tipo abastracto de dato conjunto.

  • Estructuras de datos en Java

    IntrOduCCIn Enestecaptuloseexaminanlosconceptosdemodularidadyabstraccindedatos.Lamodula-ridadeslaposibilidaddedividirunaaplicacinenpiezasmspequeasllamadasmdulos.Laabstraccindedatoseslatcnicaparainventarnuevostiposdedatosqueseanmsadecuadosaunaaplicaciny,porconsiguiente,facilitenlaescrituradelprograma.Latcnicadeabstraccindedatosesunatcnicapotentedepropsitogeneralque,cuandoseutilizaadecuadamente,puedeproducirprogramasmscortos,mslegiblesyflexibles.

    Loslenguajesdeprogramacinsoportanensuscompiladorestiposdedatosfundamentalesobsicos(predefinidos),talescomoint,charyfloatenJava,CyC++.Lenguajesdeprogra-macincomoJavatienencaractersticasquepermitenampliarellenguajeaadiendosuspropiostiposdedatos.

    Un tipodedatodefinidoporelprogramadorsedenomina tipoabstractodedato,TAD, (abstractdata type, ADT).El trminoabstractose refierealmedioenqueunprogramadorabstraealgunosconceptosdeprogramacincreandounnuevotipodedato.

    Lamodularizacindeunprogramautilizalanocindetipoabstractodedato(TAD)siemprequeseaposible.Siellenguajedeprogramacinsoportalostiposquedeseaelusuarioyelconjun-todeoperacionessobrecadatipo,seobtieneunnuevotipodedatodenominadoTAD.

    Unaclaseesuntipodedatoquecontienecdigo(mtodos)ydatos.Unaclasepermiteen-capsulartodoelcdigoylosdatosnecesariosparagestionaruntipoespecficodeunelementodeprograma,comounaventanaenlapantalla,undispositivoconectadoaunacomputadora,unafiguradeunprogramadedibujoounatarearealizadaporunacomputadora.Enestecaptuloseaprenderacrear(definiryespecificar)yautilizarclasesindividuales.

    .. ABStrACCIn En LEnGuAJES dE PrOGrAMACInLos lenguajes de programacin son las herramientasmediante las cuales los diseadores delenguajespuedenimplementarlosmodelosabstractos.Laabstraccinofrecidaporloslenguajesdeprogramacinsepuededividirendoscategoras:abstraccindedatos(pertenecientealosdatos)yabstraccindecontrol(pertenecientealasestructurasdecontrol).

    Desdecomienzosdeladcadadelossesenta,cuandosedesarrollaronlosprimeroslenguajesdeprogramacindealtonivel,hasidoposibleutilizarlasabstraccionesmsprimitivasdeambascategoras(variables,tiposdedatos,procedimientos,controldebucles,etc.).

    ... Abstracciones de controlLosmicroprocesadoresofrecendirectamenteslodosmecanismosparacontrolarel flujoyejecucin de las instrucciones: secuenciay salto. Los primeros lenguajes de programacindealtonivelintrodujeronlasestructurasdecontrol:sentenciasdebifurcacin(if)ybucles(for, while, do-loop, etc.).

    Lasestructurasdecontroldescribenelordenenelqueseejecutanlassentenciasogruposdesentencia(unidadesdeprograma).Lasunidadesdeprogramaseutilizancomobloquesbsicosdelaclsicadescomposicindescendente.Entodosloscasos,lossubprogramasconstituyenuna herramienta potente de abstraccin ya que, durante su implementacin, el programadordescribeendetallecmofuncionan.Cuandoelsubprogramasellama,bastaconconocerloquehaceynocmolohace.Deestemodo,seconviertenencajasnegrasqueamplanellenguajedeprogramacinautilizar.Engeneral,lossubprogramassonlosmecanismosmsampliamenteutilizadosparareutilizarcdigo,atravsdecoleccionesdesubprogramasenbibliotecas.

  • Tipos de datos: Clases y objetos

    Lasabstraccionesylasestructurasdecontrolseclasificanenestructurasdecontrolaniveldesentenciayaniveldeunidades.Lasabstraccionesdecontrolaniveldeunidadseconocencomoabstraccionesprocedimentales.

    abstraccin procedimental (por procedimientos)Es esencial paradisear softwaremodular y fiable la abstraccinprocedimental que sebasaenlautilizacindeprocedimientosofuncionessinpreocuparsedecmoseimplementan.Estoes posible slo si conocemos qu hace el procedimiento; esto es, conocemos la sintaxis y lasemnticaqueutilizaelprocedimientoofuncin.Laabstraccinapareceenlossubprogramasdebidoalassiguientescausas:

    Conelnombredelossubprogramas,unprogramadorpuedeasignarunadescripcinabs-tractaquecapturaelsignificadoglobaldelsubprograma.Utilizandoelnombreenlugardeescribirelcdigo,permitealprogramadoraplicarlaaccinentrminosdesudescripcindealtonivelenlugardesusdetallesdebajonivel.

    Los subprogramas proporcionan ocultacin de la informacin.Las variables locales ycualquierotradefinicinlocalseencapsulanenelsubprograma,ocultndosedeformaque no pueden utilizarse fuera del subprograma. Por consiguiente, el programador notienequepreocuparsesobrelasdefinicioneslocales.

    Losparmetrosdelossubprogramas,juntoconlaocultacindelainformacinanterior,permitencrearsubprogramasqueconstituyenentidadesdesoftwarepropias.Losdetalleslocalesdelaimplementacinpuedenestarocultos,mientrasquelosparmetrossepuedenutilizarparaestablecerlainterfazpblica.

    EnJava,laabstraccinprocedimentalseestablececonlosmtodosofuncionesmiembrosdeclases.

    otros mecanismos de abstraccin de controlLaevolucindeloslenguajesdeprogramacinhapermitidolaaparicindeotrosmecanismosparalaabstraccindecontrol,comomanejodeexcepciones,corrutinas,unidadesconcurrentesoplantillas(templates).Estasconstruccionessonsoportadasporloslenguajesdeprogramacinbasadosyorientadosaobjetos,comoJava,Modula-2,Ada,C++,SmalltalkoEiffel.

    ... Abstracciones de datosLosprimerospasoshacialaabstraccindedatossecrearonconlenguajestalescomoFORTRAN,COBOLyALGOL60,conla introduccinde tiposdevariablesdiferentes,quemanipulabanenteros,nmerosreales,caracteres,valores lgicos,etc.Sinembargo,estos tiposdedatosnopodansermodificadosynosiempreseajustabanaltipodeunoparaelquesenecesitaban.Porejemplo,eltratamientodecadenasesunadeficienciaenFORTRAN,mientrasquelaprecisinyfiabilidadparaclculosmatemticosesmuyalta.

    Lasiguientegeneracindelenguajes,incluyendoPascal,SIMULA-67yALGOL68,ofre-ciunaampliaseleccindetiposdedatosypermitialprogramadormodificaryampliarlostiposdedatosexistentesmedianteconstruccionesespecficas(porejemplo,arraysyregistros).Adems,SIMULA-67fueelprimerlenguajequemezcldatosyprocedimientosmediantelaconstruccindeclases,queeventualmenteseconvirtienlabasedeldesarrollodeprograma-cinorientadaaobjetos.

  • Estructuras de datos en Java

    Laabstraccindedatoseslatcnicadeprogramacinquepermiteinventarodefinirnuevostiposdedatos(tiposdedatosdefinidosporelusuario)adecuadosalaaplicacinquesedesearealizar.Laabstraccindedatosesunatcnicamuypotentequepermitedisearprogramasmscortos,legiblesyflexibles.Laesenciadelaabstraccinessimilaralautilizacindeuntipodedato,cuyousoserealizasintenerencuentacmoestrepresentadooimplementado.

    Lostiposdedatossonabstraccionesyelprocesodeconstruirnuevostipossellamaabstrac-cindedatos.Losnuevostiposdedatosdefinidosporelusuariosellamantiposabstractosdedatos.

    El concepto de tipo, tal como se defini en Pascal yALGOL 68, ha constituido un hitoimportante para la realizacin de un lenguaje capaz de soportar programacin estructurada.Sinembargo,estoslenguajesnosoportantotalmenteunametodologaorientadaaobjetos.Laabstraccindedatostilparaestepropsitonosloclasificaobjetosdeacuerdoasuestructuraderepresentacin,sinoquelosclasificandeacuerdoalcomportamientoesperado.Talcompor-tamientoesexpresableentrminosdeoperacionesquesonsignificativassobreesosdatos,ylasoperacionessonelnicomedioparacrear,modificaryaccederalosobjetos.

    En trminosms precisos,Ghezzi indica que un tipo de dato definible por el usuario sedenominatipoabstractodedato(TAD)si:

    Existeunaconstruccindellenguajequelepermiteasociarlarepresentacindelosdatosconlasoperacionesquelomanipulan;

    Larepresentacindelnuevotipodedatoestocultadelasunidadesdeprogramaqueloutilizan[GHEzzI87].

    Las clases de Java o deC++ cumplen las dos condiciones: agrupan los datos junto a lasoperaciones,ysurepresentacinquedaocultadeotrasclases.

    Lostiposabstractosdedatosproporcionanunmecanismoadicionalmedianteelcualsereali-zaunaseparacinclaraentrelainterfazylaimplementacindeltipodedato.Laimplementacindeuntipoabstractodedatoconstade:

    1. Larepresentacin:eleccindelasestructurasdedatos.

    2. Lasoperaciones:eleccindelosalgoritmos.

    LainterfazdeltipoabstractodedatoseasociaconlasoperacionesydatosvisiblesalexteriordelTAD.

    .. tIPOS ABStrACtOS dE dAtOSAlgunoslenguajesdeprogramacintienencaractersticasquenospermitenampliarellenguajeaadiendosuspropiostiposdedatos.Untipodedatodefinidoporelprogramadorsedenominatipoabstractodedatos(TAD)paradiferenciarlodeltipofundamental(predefinido)dedatos.Porejemplo,enJava,eltipoPunto,querepresentalascoordenadasxeydeunsistemadecoorde-nadasrectangulares,noexiste.Sinembargo,esposibleimplementareltipoabstractodedatos,considerandolosvaloresquesealmacenanenlasvariablesyquoperacionesestndisponiblesparamanipularestasvariables.Enesencia,untipoabstractoesuntipodedatoqueconstadedatos(estructurasdedatospropias)yoperacionesquesepuedenrealizarsobreellos.UnTADsecom-ponedeestructurasdedatosylosprocedimientosofuncionesquemanipulanesasestructurasdedatos.

  • Tipos de datos: Clases y objetos

    Para recordarUn tipo abstracto de datos puede definirse mediante la ecuacin:

    taD = Representacin (datos) + Operaciones (funciones y procedimientos)

    Laestructuradeuntipoabstractodedato(clase),desdeunpuntodevistaglobal,secomponedelainterfazydelaimplementacin(Figura2.1).

    Lasestructurasdedatosrealeselegidasparaalmacenarlarepresentacindeuntipoabstractodedatossoninvisiblesalosusuariosoclientes.LosalgoritmosutilizadosparaimplementarcadaunadelasoperacionesdelosTADestnencapsuladasdentrodelospropiosTAD.Lacaracters-ticadeocultamientodelainformacinsignificaquelosobjetostieneninterfacespblicas.Sinembargo,lasrepresentacioneseimplementacionesdeesasinterfacessonprivadas.

    Figura . Estructura de un tipo abstracto de datos (TAD)

    ... Ventajas de los tipos abstractos de datosUntipoabstractodedatosesunmodelo(estructura)conunnmerodeoperacionesqueafectanaesemodelo.Lostiposabstractosdedatosproporcionannumerososbeneficiosalprogramador,quesepuedenresumirenlossiguientes:

    1. Permiten una mejor conceptualizacin y modelizacin del mundo real. Mejoran larepresentacinylacomprensibilidad.Clarificanlosobjetosbasadosenestructurasycomportamientoscomunes.

  • Estructuras de datos en Java

    2. Mejoranlarobustezdelsistema.Sihaycaractersticassubyacentesenloslenguajes,per-mitenlaespecificacindeltipodecadavariable.Lostiposabstractosdedatospermitenlacomprobacindetiposparaevitarerroresdetipoentiempodeejecucin.

    3. Mejoranelrendimiento(prestaciones).Parasistemastipeados(tipificados),elconoci-mientodelosobjetospermitelaoptimizacindetiempodecompilacin.

    4. Separanlaimplementacindelaespecificacin.Permitenlamodificacinylamejoradelaimplementacinsinafectarlainterfazpblicadeltipoabstractodedato.

    5. Permiten la extensibilidaddel sistema.Los componentesde software reutilizables sonmsfcilesdecrearymantener.

    6. Recogenmejorlasemnticadeltipo.Lostiposabstractosdedatosagrupanolocalizanlasoperacionesylarepresentacindeatributos.

    UnprogramaquemanejaunTADlohaceteniendoencuentalasoperacionesolafunciona-lidadquetiene,sininteresarseporlarepresentacinfsicadelosdatos.Esdecir,losusuariosdeunTADsecomunicanconsteapartirdelainterfazqueofreceelTADmediantefuncionesdeacceso.PodracambiarselaimplementacindeltipodedatosinafectaralprogramaqueusaelTADyaqueparaelprogramaestoculta.

    ... Implementacin de los tAdLasunidadesdeprogramacindelenguajesquepuedenimplementarunTADrecibendistintosnombres:

    Modula-2 mduloAda paqueteC++ claseJava clase

    EnestoslenguajessedefinenlaespecificacindelTAD,quedeclaralasoperacionesylosdatos,ylaimplementacin,quemuestraelcdigofuentedelasoperaciones,quepermaneceocultoalexteriordelmdulo.

    .. ESPECIFICACIn dE LOS tAdElobjetivodelaespecificacinesdescribirelcomportamientodelTAD;constadedospartes,la descripcinmatemtica del conjunto de datos y la de las operaciones definidas en ciertoselementosdeeseconjuntodedatos.

    LaespecificacindelTADpuedetenerunenfoqueinformal,quedescribelosdatosylasoperacionesrelacionadasen lenguajenatural.Otroenfoquemasriguroso, laespecificacinformal,suponesuministrarunconjuntodeaxiomasquedescribenlasoperacionesensuas-pectosintcticoysemntico.

    ... Especificacin informal de un tAdConstadedospartes:

    Detallarenlosdatosdeltipolosvaloresquepuedentomar. Describirlasoperacionesrelacionndolasconlosdatos.

  • Tipos de datos: Clases y objetos

    Elformatoquegeneralmenteseemplea,primeroespecificaelnombredelTADylosdatos:

    TADnombredeltipo(valoresysudescripcin)

    Acontinuacincadaunadelasoperacionesconsusargumentos,yunadescripcinfuncionalenlenguajenatural,conesteformato:

    Operacin(argumentos) Descripcin funcional

    Comoejemplo,sevaaespecificareltipoabstractodedatosConjunto:

    TADConjunto(coleccindeelementossinduplicidades,puedenestarencualquierorden,seusapararepresentarlosconjuntosmatemticosconsusoperaciones).

    Operaciones,seponenlasoperacionesbsicassobreconjuntos:

    Conjuntovacio.Creaunconjuntosinelementos.

    Aadir(Conjunto,elemento).Comprueba si el elemento formaparte del conjunto; en caso negativo, es aadido.Laoperacinmodificaalconjunto.

    Retirar(Conjunto,elemento).Sielelementopertenecealconjunto,eseliminadodeste.Laoperacinmodificaalconjunto.

    Pertenece(Conjunto,elemento).Verificasielelementoformapartedelconjunto,encuyocasodevuelvecierto.

    Esvacio(Conjunto).Verificasielconjuntonotieneelementos,encuyocasodevuelvecierto.

    Cardinal(Conjunto).Devuelveelnmerodeelementosdelconjunto.

    Union(Conjunto,Conjunto).Realizalaoperacinmatemticadelaunindedosconjuntos.Laoperacindevuelveunconjuntoconloselementoscomunesynocomunesalosdosconjuntos.

    Sepuedenespecificarmsoperacionessobreconjuntos,tododependerdelaaplicacinquesequieradaralTAD.

    A tener en cuentaLa especificacin informal de un TAD tiene como objetivo describir los datos del tipo y las operaciones segn la funcionalidad que tienen. No sigue normas rgidas al hacer la especifi-cacin, simplemente indica, de forma comprensible, la accin que realiza cada operacin.

    ... Especificacin formal de un tAdLaespecificacinformalproporcionaunconjuntodeaxiomasquedescribenelcomportamientodetodaslasoperaciones.Ladescripcinhadeincluirunapartedesintaxis,encuantoalostipos

  • 0 Estructuras de datos en Java

    delosargumentosyaltipodelresultado,yunapartedesemntica,dondesedetallalaexpresindelresultadoqueseobtieneparaunosvaloresparticularesdelosargumentos.LaespecificacinformalhadeserlobastantepotenteparaquecumplaelobjetivodeverificarlacorreccindelaimplementacindelTAD.

    ElesquemaquesigueconstadeunacabeceraconelnombredelTADylosdatos:

    TAD nombre del tipo (valores que toma los datos del tipo)

    Lesiguelasintaxisdelasoperaciones,quelistalasoperacionesmostrandolostiposdelosargumentosyeltipodelresultado:

    SintaxisOperacin(Tipo argumento, ...) -> Tipo resultado Acontinuacin se explica la semnticade lasoperaciones.sta se construyedandounos

    valoresparticularesalosargumentosdelasoperaciones,apartirdelosqueseobtieneunaex-presin resultado. ste puede tener referencias a tipos ya definidos, valores de tipo lgico oreferenciasaotrasoperacionesdelpropioTAD.

    SemnticaOperacin(valores particulares argumentos) expresin resultado

    Alhacerunaespecificacinformal,siemprehayoperacionesdefinidasporsmismasqueseconsideranconstructoresdelTAD.SepuededecirquemedianteestosconstructoressegenerantodoslosposiblesvaloresdelTAD.Normalmente,seeligecomoconstructorlaoperacinqueinicializa(porejemplo,ConjuntovacoenelTADConjunto)ylaoperacinqueaadeundatooelemento(estaoperacinescomnalamayoradelostiposabstractosdedatos).Seacostumbraamarcarconunasteriscolasoperacionesquesonconstructores.

    AcontinuacinseespecificaformalmenteelTADConjunto;paraformarlaexpresinresul-tadosehaceuso,siesnecesario,delasentenciaalternativasi-entonces-sino.

    TADConjunto(coleccindeelementossinduplicidades,puedenestarencualquierorden,seusapararepresentarlosconjuntosmatemticosconsusoperaciones).

    Sintaxis *Conjuntovacio -> Conjunto *Aadir(Conjunto, Elemento) -> Conjunto Retirar(Conjunto, Elemento) -> Conjunto Pertenece(Conjunto, Elemento) -> boolean Esvacio(Conjunto) -> boolean Cardinal(Conjunto) -> entero Union(Conjunto, Conjunto) -> Conjunto Semntica e1,e2 Elemento y C,D Conjunto Aadir(Aadir(C, e1), e1) Aadir(C, e1) Aadir(Aadir(C, e1), e2) Aadir(Aadir(C, e2), e1) Retirar(Conjuntovacio, e1) Conjuntovacio Retirar(Aadir(C, e1), e2) si e1 = e2 entonces Retirar(C,e2) sino Aadir(Retirar(C,e2),e1)

  • Tipos de datos: Clases y objetos

    Pertenece(Conjuntovacio, e1) falso Pertenece(Aadir(C, e2), e1) si e1 = e2 entonces cierto sino Pertenece(C, e1) Esvacio(Conjuntovacio) cierto Esvacio(Aadir(C, e1)) falso Cardinal(Conjuntovacio) Cero Cardinal(Aadir(C, e1)) si Pertenece(C,e1) entonces Cardinal(C) sino 1 + Cardinal(C) Union(Conjuntovacio, Conjuntovacio) Conjuntovacio Union(Conjuntovacio, Aadir(C, e1)) Aadir(C, e1) Union(Aadir(C, e1), D) Aadir(Union(C, D), e1)

    .. CLASES Y OBJEtOSElparadigmaorientadoaobjetosnacien1969delamanodeldoctornoruegoKristinNygaard,quealintentarescribirunprogramadecomputadoraquedescribieraelmovimientodelosbarcosatravsdeunfiordo,descubriqueeramuydifcilsimularlasmareas,losmovimientosdelosbarcosylasformasdelalneadelacostaconlosmtodosdeprogramacinexistentesenesemomento.Descubriqueloselementosdelentornoquetratabademodelarbarcos,mareasylneadelacostadelosfiordosylasaccionesquecadaelementopodaejecutarmantenanunasrelacionesqueeranmsfcilesdemanejar.

    Lastecnologasorientadasaobjetoshanevolucionadomucho,peromantienenlarazndeserdelparadigma:combinacindeladescripcindeloselementosenunentornodeprocesodedatosconlasaccionesejecutadasporesoselementos.Lasclasesylosobjetos,comoinstanciasoejemplaresdeellas,sonloselementosclavesobrelosquesearticulalaorientacinaobjetos.

    ... Qu son objetos?Enelmundoreal,laspersonasidentificanlosobjetoscomocosasquepuedenserpercibidasporloscinco sentidos.Losobjetos tienenpropiedadesespecficas, comoposicin, tamao,color,forma,textura,etc.quedefinensuestado.Losobjetostambinposeenciertoscomportamientosqueloshacendiferentesdeotrosobjetos.

    Booch1defineunobjetocomoalgoquetieneunestado,uncomportamientoyunaidenti-dad.Imaginemosunamquinadeunafbrica.Elestadodelamquinapuedeestarfuncionan-do/parando(on/off),hayquetenerencuetasupotencia,velocidadmxima,velocidadactual,temperatura,etc.Sucomportamientopuedeincluiraccionesparaarrancarypararlamquina,obtenersutemperatura,activarodesactivarotrasmquinas,conocerlascondicionesdesealdeerrorocambiarlavelocidad.Suidentidadsebasaenelhechodequecadainstanciadeunamquinaesnica,talvezidentificadaporunnmerodeserie.Lascaractersticasqueseeligenparaenfatizarelestadoyelcomportamientoseapoyarnencmounobjetomquinaseutilizarenunaaplicacin.Enundiseodeunprogramaorientadoaobjetos,secreaunaabstraccin(unmodelosimplificado)delamquinabasadaenlaspropiedadesyenelcomportamientoquesontileseneltiempo.

    1 Booch,Grady.Anlisisydiseoorientadoaobjetosconaplicaciones.Madrid:DazdeSantos/Addison-Wesley,1995(librotraducidoalespaolporlosprofesoresCuevayJoyanes).

  • Estructuras de datos en Java

    MartinyOdelldefinenunobjetocomocualquiercosa,realoabstracta,enlaquesealmace-nandatosyaquellosmtodos(operaciones)quemanipulanlosdatos.Pararealizaresaactividad,seaadenacadaobjetodelaclaselospropiosdatosasociadosconsuspropiosmtodosmiembroquepertenecenalaclase.

    Unmensajeesunainstruccinqueseenvaaunobjetoyque,cuandoserecibe,ejecutasusacciones.Unmensajeincluyeunidentificadorquecontienelaaccinquehadeejecutarelobjetojuntoconlosdatosquenecesitaelobjetopararealizarsutrabajo.Losmensajes,porconsiguiente,formanunaventanadelobjetoalmundoexterior.

    Elusuariodeunobjetosecomunicaconelobjetomediantesuinterfaz,unconjuntodeope-raciones definidas por la clase del objeto demodo que sean todas visibles al programa.Unainterfazsepuedeconsiderarcomounavistasimplificadadeunobjeto.Porejemplo,undispositivoelectrnicocomounamquinadefaxtieneunainterfazdeusuariobiendefinida;porejemplo,esainterfazincluyeelmecanismodeavancedelpapel,botonesdemarcado,elreceptoryelbotnenviar.Elusuarionotienequeconocercmoestconstruidalamquinainternamente,elpro-tocolodecomunicacionesuotrosdetalles.Dehecho,laaperturadelamquinaduranteelperiododegarantapuedeanularla.

    ... Qu son clases?Entrminosprcticos,unaclaseesuntipodefinidoporelusuario.Lasclasessonlosbloquesdeconstruccinfundamentalesdelosprogramasorientadosaobjetos.Boochdefineunaclasecomounconjuntodeobjetosquecompartenunaestructurayuncomportamientocomunes.

    Unaclasecontienelaespecificacindelosdatosquedescribenunobjetojuntoconladescrip-cindelasaccionesqueunobjetoconocecmohadeejecutar.Estasaccionesseconocencomoserviciosomtodos.Unaclase incluye tambin todos losdatosnecesariospara describir losobjetoscreadosapartirdelaclase.Estosdatosseconocencomoatributos,variablesovariablesinstancia.Eltrminoatributoseutilizaenanlisisydiseoorientadoaobjetos,yeltrminovariableinstanciasesueleutilizarenprogramasorientadosaobjetos.

    .. dECLArACIn dE unA CLASEAntesdequeunprogramapuedacrearobjetosdecualquierclase,stadebeserdefinida.Ladefinicindeunaclasesignificaquesedebedaralamismaunnombre,darnombretambina loselementosquealmacenan susdatosydescribir losmtodosque realizarn lasaccionesconsideradasenlosobjetos.

    Lasdefinicioneso especificacionesno sonuncdigodeprogramaejecutable.Seutilizanparaasignaralmacenamientoalosvaloresdelosatributosusadosporelprogramayreconocerlosmtodosqueutilizarelprograma.Normalmente,sesitanenarchivosformandolosdeno-minadospackages,seutilizaunarchivoparavariasclasesqueestnrelacionadas.

    Formato

    class NombreClase{ lista_de_miembros}

  • Tipos de datos: Clases y objetos

    NombreClase Nombredefinidoporelusuarioqueidentificalaclase(puede incluirletras,nmerosysubrayados).

    lista _ de _ miembros mtodosydatosmiembrosdelaclase.

    Ejemplo .DefinicindeunaclasellamadaPuntoquecontienelascoordenadasxeydeunpuntoenunplano.

    class Punto{ private int x; // coordenada x private int y; // coordenada y public Punto(int x _ , int y _ ) // constructor { x = x _ ; y = y _ ; } public Punto() // constructor sin argumentos { x = y = 0; } public int leerX() // devuelve el valor de x { return x; } public int leerY() // devuelve el valor de y { return y; } void fijarX(int valorX) // establece el valor de x { x = valorX; } void fijarY(int valorY) // establece el valor de y { y = valorY; }}

    Ejemplo .DeclaracindelaclaseEdad.

    class Edad{ private int edadHijo, edadMadre, edadPadre; datos public Edad(){...} mtodo especial: constructor public void iniciar(int h,int e,int p){...} mtodos public int leerHijo(){...}

  • Estructuras de datos en Java

    public int leerMadre(){...} public int leerPadre(){...}}

    ... Objetos Unavezqueunaclasehasidodefinida,unprogramapuedecontenerunainstanciadelaclase,denominadaobjetodelaclase.Unobjetosecreaconeloperadornew aplicadoaunconstructordelaclase.UnobjetodelaclasePuntoinicializadoalascoordenadas(2,1)sera:

    new Punto(2,1);

    Eloperadornewcreaelobjetoydevuelveunareferenciaalobjetocreado.Estareferenciaseasignaaunavariabledeltipodelaclase.Elobjetopermanecervivosiemprequeestreferen-ciadoporunavariabledelaclasequeesinstancia.

    Formato para definir una referencia

    NombreClase varReferencia;

    Formato para crear un objeto

    varReferencia = new NombreClase(argmntos _ constructor);

    Todaclasetieneunoomasmtodos,denominadosconstructores,parainicializarelobjetocuandoescreado;tienenelmismonombrequeeldelaclase,notienentipoderetornoypuedenestarsobrecargados.EnlaclaseEdaddelEjemplo2.2,elconstructornotieneargumentos,sepuedecrearunobjeto:

    Edad f = new Edad();

    Eloperadordeaccesoaunmiembro(.)seleccionaunmiembroindividualdeunobjetodelaclase.Porejemplo:

    Punto p;p = new Punto();p.fijarX (100);System.out.println(" Coordenada x es " + p.leerX());

    El operador punto (.) se utiliza con los nombres de los mtodos y variables instancia para especificar que son miembros de un objeto.Ejemplo: Clase DiaSemana, contiene el mtodo visualizar() DiaSemana hoy; // hoy es una referencia hoy = new DiaSemana(); // se ha creado un objeto hoy.visualizar(); // llama al mtodo visualizar()

  • Tipos de datos: Clases y objetos

    ... Visibilidad de los miembros de la clase Unprincipiofundamentalenprogramacinorientadaaobjetoseslaocultacindelainfor-macin,quesignificaqueadeterminadosdatosdelinteriordeunaclasenosepuedeaccederpormtodosexternosaella.Elmecanismoprincipalparaocultardatosesponerlosenunaclaseyhacerlosprivados.Alosdatosomtodosprivadosslosepuedeaccederdesdedentrodelaclase.Porelcontrario,losdatosomtodospblicossonaccesiblesdesdeelexteriordelaclase.

    Noaccesiblesdesdeelexteriordelaclase(accesodenegado)

    Privado

    Datoso

    Mtodos

    Accesibledesdeelexteriordelaclase

    Pblico

    Datoso

    Mtodos

    Figura . Secciones pblica y privada de una clase

    Paracontrolarelaccesoalosmiembrosdelaclaseseutilizantresespecificadoresdeacceso:public,privateyprotected.Cadamiembrodelaclaseestprecedidodelespecificadordeaccesoquelecorresponde.

    Formato

    class NombreClase{ private declaracin miembro privado; // miembros privados protected declaracin miembro protegido; // miembros protegidos public declaracin miembro pblico; // miembros pblicos}

    Elespecificadorpublicdefinemiembrospblicos,quesonaquellosalosquesepuedeac-cederporcualquiermtododesdefueradelaclase.Alosmiembrosquesiguenalespecificadorprivateslosepuedeaccederpormtodosmiembrosdelamismaclase.Alosmiembrosquesiguenalespecificadorprotectedsepuedeaccederpormtodosmiembrodelamismaclaseodeclasesderivadas,ascomopormtodosdeotrasclasesqueseencuentranenelmismopaquete.Losespecificadorespublic,protectedyprivatepuedenaparecerencualquierorden.Sinoseespecificaacceso(accesopordefecto)aunmiembrodeunaclase,astesepuedeaccederdesdelosmtodosdelaclaseydesdecualquiermtododelasclasesdelpaqueteenelqueseencuentra.

    Ejemplo .DeclaracindelaclaseFotoyMarcoconmiembrosdeclaradoscondistintavisibilidad.Ambasclasesformanpartedelpaquetesoporte.

  • Estructuras de datos en Java

    package soporte;class Foto{ private int nt; private char opd; String q; public Foto(String r) // constructor { nt = 0; opd = 'S'; q = new String(r); } public double mtd(){...}}class Marco{ private double p; String t; public Marco() {...} public void poner() { Foto u = new Foto("Paloma"); p = u.mtd(); t = "**" + u.q + "**"; }}

    tabla . Visibilidad, x indica que el acceso est permitido

    tipo de miembro

    Miembro de la misma clase

    Miembro de una clase derivada

    Miembro de clase del paquete

    Miembro de clase de otro paquete

    Private xEn blanco x xProtected x x xPublic x x x x

    Aunquelasespecificacionespblicas,privadasyprotegidaspuedenaparecerencualquierorden,enJavalosprogramadoressuelenseguirciertasreglaseneldiseoquecitamosaconti-nuacin,paraqueustedpuedaelegirlaqueconsideremseficiente.

    1. Ponerlosmiembrosprivadosprimero,debidoaquecontienenlosatributos(datos).

    2. Colocarlosmiembrospblicosprimero,debidoaquelosmtodosylosconstructoressonlainterfazdelusuariodelaclase.

    Enrealidad,talvezelusomsimportantedelosespecificadoresdeaccesoesimplementarla ocultacinde la informacin.Elprincipiodeocultacin de la informacin indicaque todalainteraccinconunobjetosedeberestringirautilizarunainterfazbiendefinidaquepermitaignorarlosdetallesdeimplementacindelosobjetos.Porconsiguiente,losdatosylosmtodos

  • Tipos de datos: Clases y objetos

    pblicosformanlainterfazexternadelobjeto,mientrasqueloselementosprivadossonlosas-pectosinternosquenonecesitanseraccesiblesparausarelobjeto.Loselementosdeunaclasesinespecificadorylosprotectedtienenlasmismaspropiedadesquelospblicosrespectoalasclasesdelpaquete.

    El principio de encapsulamiento significa que las estructuras de datos internas utilizadas en la implementacin de una clase no pueden ser accesibles directamente al usuario de la clase.

    ... Mtodos de una claseLasmtodosenJavasiempresonmiembrosdeclases,nohaymtodosofuncionesfueradelasclases.Laimplementacindelosmtodosseincluyedentrodelcuerpodelaclase.LaFigura2.3muestraladeclaracincompletadeunaclase.

    ? Encapsulacin.

    Figura . Definicin tpica de una clase

    Ejemplo .

    LaclaseRacionaldefineelnumeradoryeldenominadorcaractersticosdeunnmeroracional.Porcadadatoseproporcionaunmtodomiembroquedevuelvesuvaloryunmtodoqueasignanumeradorydenominador.Tieneunconstructorqueinicializaunobjetoa0/1.

    class Racional{ private int numerador; private int denominador; public Racional() { numerador = 0; denominador = 1; }

  • Estructuras de datos en Java

    public int leerN() { return numerador; } public int leerD() { return denominador; } public void fijar (int n, int d) { numerador = n; denominador = d; }}

    Ejercicio .Definir una claseDiaAnyo que contenga los atributosmes y da, elmtodoigual() y elmtodovisualizar().Elmesseregistracomounvalorentero(1,Enero;2,Febrero;etc.).Eldadelmesseregistraenlavariableenterada.Escribirunprogramaquecompruebesiunafechaesladesucumpleaos.

    Elmtodomain()delaclaseprincipal,Cumple,creaunobjetoDiaAnyoyllamaalmtodoigual()paradeterminarsicoincidelafechadelobjetoconlafechadesucumpleaos,quesehaledodeldispositivodeentrada.

    import java.io.*;class DiaAnyo{ private int mes; private int dia;

    public DiaAnyo(int d, int m) { dia = d; mes = m; } public boolean igual(DiaAnyo d) { if ((dia == d.dia) && (mes == d.mes)) return true; else return false; } // muestra en pantalla el mes y el da public void visualizar() { System.out.println("mes = " + mes + " , dia = " + dia); }} // clase principal, con mtodo mainpublic class Cumple{ public static void main(String[] ar)throws IOException { DiaAnyo hoy; DiaAnyo cumpleanyos; int d, m; BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in));

  • Tipos de datos: Clases y objetos

    System.out.print("Introduzca fecha de hoy, dia: "); d = Integer.parseInt(entrada.readLine()); System.out.print("Introduzca el nmero de mes: "); m = Integer.parseInt(entrada.readLine());

    hoy = new DiaAnyo(d,m);

    System.out.print("Introduzca su fecha de nacimiento, dia: "); d = Integer.parseInt(entrada.readLine()); System.out.print("Introduzca el nmero de mes: "); m = Integer.parseInt(entrada.readLine()); cumpleanyos = new DiaAnyo(d,m); System.out.print( " La fecha de hoy es "); hoy.visualizar(); System.out.print( " Su fecha de nacimiento es "); cumpleanyos.visualizar(); if (hoy.igual(cumpleanyos)) System.out.println( "Feliz cumpleaos ! "); else System.out.println( "Feliz dia ! "); }}

    ... Implementacin de las clasesElcdigofuentedeladefinicindeunaclase,contodossusmtodosyvariablesinstanciaseal-macenaenarchivosdetextoconextensin.javayelnombredelaclase,porejemplo,Racional.java.Normalmente,sesitalaimplementacindecadaclaseenunarchivoindependiente.

    Lasclasespuedenprocederdediferentesfuentes:

    Sepueden declarar e implementar sus propias clases.El cdigo fuente siempre estardisponible;puedenestarorganizadasporpaquetes.

    Sepuedenutilizarclasesquehayansidoescritasporotraspersonasoinclusoquesehayancomprado.Enestecaso,sepuededisponerdelcdigofuenteoestarlimitadoautilizarelbytecodedelaimplementacin.Sernecesariodisponerdelpaquetedondeseencuentran.

    Sepuedenutilizar clases de los diversospackages que acompaan a su software dedesarrolloJava.

    ... Clases pblicasLadeclaracindeunaclasepuedeincluirelmodificadorpubliccomoprefijoenlacabeceradelaclase.Porejemplo:

    public class Examen{ // miembros de la clase}

    LaclaseExamenpuedeserutilizadaporlasclasesqueseencuentranensumismoarchivo(package),oporclasesdecualquierotropaqueteoarchivo.Habitualmente,lasclasessedefinen

  • 0 Estructuras de datos en Java

    comopublic,anoserquesequierarestringirsuusoalasclasesdelpaquete.Unaclasedecla-radasinelprefijopublicestableceunarestriccinimportante,yesqueslopodrserutilizadaporlasclasesdefinidasenelmismopaquete.

    AdvertenciaEl especificador de acceso public es el nico que se puede especificar en la cabecera de una clase.

    .. PAQuEtESLospaquetessonlaformaquetieneJavadeorganizarlosarchivosconlasclasesnecesariasparaconstruirlasaplicaciones.Javaincorporavariospaquetes,porejemplojava.lang ojava.io,conlasclasesbsicasparaconstruirprogramas:System, String, Integer ...

    ... Sentencia packageCmosepuededefinirunpaquete?Lasentenciapackage seutilizaparaestecometido.Enprimerlugarsedebeincluirlasentenciapackagecomoprimeralneadelarchivofuentedecadaunadelasclasesdelpaquete.Porejemplo,si lasclasesLapiz,BoligrafoyFoliosevanaorganizarformandoelpaqueteescritorio,elesquemaaseguireselsiguiente:

    // archivo fuente Lapiz.javapackage escritorio; public class Lapiz { // miembros de clase Lapiz}// archivo fuente Boligrafo.javapackage escritorio; public class Boligrafo{ // miembros de clase Boligrafo}// archivo fuente Folio.javapackage escritorio; public class Folio{ // miembros de clase Folio}

  • Tipos de datos: Clases y objetos

    Formato

    package NombrePaquete;

    Ensegundolugar,unavezcreadoelarchivofuentedecadaclasedelpaquete,sedebenubicarcadaunoenunsubdirectorioconelmismonombrequeeldelpaquete.EnelesquemaanteriorseubicarnlosarchivosLapiz.java,Boligrafo.javayFolio.javaenelcaminoescritorio.

    Elusodepaquetestienedosbeneficiosimportantes:

    1. Lasrestriccionesdevisibilidadsonmenoresentreclasesqueestndentrodelmismopaquete.Desdecualquierclasedeunpaquete,losmiembrosprotectedylosmiembrossinmodifi-cadordevisibilidadsonaccesibles,peronolosondesdeclasesdeotrospaquetes.

    2. Laseleccindelasclasesdeunpaquetesepuedeabreviarconlasentenciaimportdelpaquete.

    ... ImportLasclasesqueseencuentranenlospaquetesseidentificanutilizandoelnombredelpaquete,elselectorpunto(.)y,acontinuacin,elnombredelaclase.Porejemplo,ladeclaracindelaclaseArteconatributosdelaclasePrintStream(paquetejava.io)yLapiz(paqueteescritorio):

    public class Arte{ private java.io.PrintStream salida; private escritorio.Lapiz p;}

    Lasentenciaimportfacilitalaseleccindeunaclase,permiteescribirnicamentesunom-bre,evitandoelnombredelpaquete.Ladeclaracinanteriorsepuedeabreviar:

    import java.io.PrintStream;import escritorio.*;public class Arte{ private PrintStream salida; private Lapiz p;}

    Lasentenciaimportdebeaparecerantesdeladeclaracindelasclases,acontinuacindelasentenciapackage.Tienedosformatos:

    Formato

    import identificadorpaquete.nombreClase;import identificadorpaquete.*;

    Elprimerformatoespecificaunaclaseconcreta.Elsegundoformatoindicaqueparatodaslasclasesdeunpaquetenohacefaltacualificarelnombredelaclaseconelnombredelpaquete.

  • Estructuras de datos en Java

    Confrecuenciaseutilizaelformato.*.Tienelaventajadepodersimplificarcualquierclasedelpaquete,perosepuedensealarlossiguientesproblemas:

    Sedesconocequclasesconcretasdelpaqueteseestnutilizando.Porcontra,conunasentenciaimportporcadaclaseutilizadaseconocenlasclasesempleadas.

    Puedehabercolisionesentrenombresdeclasesdeclaradasenelarchivoynombresdeclasesdelpaquete.

    Mayortiempodecompilacin,debidoaqueelcompiladorbuscalaexistenciadecualquierclaseenelpaquete.

    NotaAunque aparezca la sentencia import paquete.*, el compilador genera bytecode slo para las clases utilizadas.

    Ejemplo .SecreaelpaquetenumericoconlaclaseRandomyseutilizalaclaseenunaaplicacin.

    package numerico;

    public Random{ // ...}

    Alutilizarlaclaseenotroarchivo:

    import java.util.*import numerico.*;

    Enelpaquetejava.utilseencuentralaclaseRandom,porelloseproduceunaambigedadconlaclaseRandomdelpaquetenumerico.EsnecesariocualificarcompletamenteelnombredelaclaseRandomde,porejemplo,java.util.

    java.util.Random aleatorio; // define una referencia

    .. COnStruCtOrESUnconstructoresunmtodoqueseejecutaautomticamentecuandosecreaunobjetodeunaclase.Sirveparainicializarlosmiembrosdelaclase.

    Elconstructortieneelmismonombrequelaclase.Cuandosedefinenosepuedeespecificarunva-lorderetorno,nuncadevuelveunvalor.Sinembargo,puedetomarcualquiernmerodeargumentos.

    Reglas 1. El constructor tiene el mismo nombre que la clase. 2. Puede tener cero o ms argumentos. 3. No tiene tipo de retorno.

  • Tipos de datos: Clases y objetos

    Ejemplo .LaclaseRectangulotieneunconstructorconcuatroparmetros.

    public class Rectangulo{ private int izdo; private int superior; private int dcha; private int inferior; // constructor public Rectangulo(int iz, int sr, int d, int inf) { izdo = iz; superior = sr; dcha = d; inferior = inf; } // definiciones de otros mtodos miembro}

    Alcrearunobjeto,sepasanlosvaloresdelosargumentosalconstructorconlamismasin-taxisqueladellamadaaunmtodo.Porejemplo:

    Rectangulo Rect = new Rectangulo(25, 25, 75, 75);

    SehacreadounainstanciadeRectangulopasandovaloresconcretosalconstructordelaclase,ydeestaformaquedainicializado.

    ... Constructor por defectoUnconstructorquenotieneparmetrosse llamaconstructorpordefecto.Unconstructorpordefectonormalmenteinicializalosmiembrosdatodelaclaseconvalorespordefecto.

    ReglaJava crea automticamente un constructor por defecto cuando no existen otros cons-tructores. Tal constructor inicializa las variables de tipo numrico (int, float ...) a cero, las variables de tipo boolean a true y las referencias a null.

    Ejemplo .Elconstructorpordefectoinicializaxeya0.

    public class Punto{ private int x; private int y; public Punto() // constructor por defecto { x = 0;

  • Estructuras de datos en Java

    y = 0; }}

    CuandosecreaunobjetoPunto,susmiembrosdatoseinicializana0.

    Punto P1 = new Punto() ; // P1.x == 0, P1.y == 0

    PrecaucinTenga cuidado con la escritura de una clase con slo un constructor con argumentos. Si se omite un constructor sin argumento, no ser posible utilizar el constructor por defecto. La definicin NomClase c = new NomClase() no ser posible.

    ... Constructores sobrecargadosAl igual que se puede sobrecargar unmtododeuna clase, tambin se puede sobrecargar elconstructordeunaclase.Dehecho,losconstructoressobrecargadossonbastantefrecuentesyproporcionandiferentesalternativasparainicializarobjetos.

    ReglaPara prevenir a los usuarios de la clase de crear un objeto sin parmetros, se puede: (1) omitir el constructor por defecto, o bien (2) hacer el constructor privado.

    Ejemplo .Laclase EquipoSonido sedefinecontresconstructores:unopordefecto,otroconunargumentodetipocadenayeltercerocontresargumentos.

    public class EquipoSonido{ private int potencia; private int voltios; private int numCd; private String marca; public EquipoSonido() // constructor por defecto { marca = "Sin marca"; System.out.println("Constructor por defecto"); } public EquipoSonido(String mt) { marca = mt; System.out.println("Constructor con argmto cadena "); } public EquipoSonido(String mt, int p, int v) { marca = mt;

  • Tipos de datos: Clases y objetos

    potencia = p; voltios = v; numCd = 20; System.out.println("Constructor con tres argumentos "); } public double factura(){...}};

    LainstanciacindeunobjetoEquipoSonidopuedehacersellamandoacualquierconstructor:

    EquipoSonido rt, gt, ht; // define tres referenciasrt = new EquipoSonido(); // llamada al constructor por defectogt = new EquipoSonido("JULAT");rt = new EquipoSonido("PARTOLA",35,220);

    .. rECOLECCIn dE OBJEtOSEnJava,unobjetosiemprehadeestarreferenciadoporunavariable;enelmomentoenqueunobjetodejadeestarreferenciado,seactivalarutinaderecoleccindememoria,sepuededecirqueelobjetoesliberadoylamemoriaqueocupapuedeserreutilizada.Porejemplo:

    Punto p = new Punto(1,2);

    lasentencia p = nullprovocaqueelobjetoPuntosealiberadoautomticamente.Elpropiosistemaseencargade recolectar losobjetosendesusoparaaprovechar lame-

    moria ocupada. Para ello, hay un proceso que se activa peridicamente y toma los objetosquenoestnreferenciadosporningunavariable.ElprocesolorealizaelmtodoSystem.gc(garbagecollection).Porejemplo,elsiguientemtodocreaobjetosContadorqueseliberanalperdersureferencia.

    void objetos(){ Contador k, g, r, s; // se crean cuatro objetos k = new Contador(); g = new Contador(); r = new Contador(); s = new Contador(); /* la siguiente asignacin hace que g referencie al mismo objeto que k, adems el objeto original de g ser automticamente recolectado. */ g = k; /* ahora no se activa el recolector porque g sigue apuntando al objeto. */ k = null; /* a continuacin s se activa el recolector para el objeto original de r. */ r = new Contador();

    } // se liberan los objetos actuales apuntados por g, r, s

  • Estructuras de datos en Java

    ... Mtodo finalize()Elmtodofinalize()esespecial,sellamaautomticamentesihasidodefinidoenlaclase,justoantesquelamemoriadelobjetorecolectadovayaaserdevueltaalsistema.Elmtodonoesundestructordelobjeto,noliberamemoria;enalgunasaplicaciones,sepuedeutilizarparaliberarciertosrecursosdelsistema.

    REGLAfinalize() es un mtodo especial con estas caractersticas: No devuelve valor, es de tipo void. No tiene argumentos. No puede sobrecargarse. Su visibilidad es protected.

    Ejercicio .Sedeclarandosclases,cadaunaconsumtodofinalize().Elmtodomain()creaobjetosdeambasclases;lasvariablesquereferencianalosobjetossemodificanparaquecuandoseactivelarecoleccinautomticadeobjetosseliberelamemoriadeestos;hayunallamadaaSystem.gc()paranoesperaralallamadainternadelsistema.

    class Demo{ private int datos; public Demo(){datos = 0;} protected void finalize() { System.out.println("Fin de objeto Demo"); } }class Prueba{ private double x; public Prueba (){x = -1.0;} protected void finalize() { System.out.println("Fin de objeto Prueba"); } }public class ProbarDemo{ public static void main(String[] ar) { Demo d1, d2; Prueba p1, p2; d1 = new Demo(); p1 = new Prueba(); System.gc(); // no se libera ningn objeto

  • Tipos de datos: Clases y objetos

    p2 = p1; p1 = new Prueba(); System.gc(); // no se libera ningn objeto p1 = null; d1 = new Demo(); System.gc(); // se liberan dos objetos d2 = new Demo(); } // se liberan los objetos restantes }

    .. OBJEtO QuE EnVIA EL MEnSAJE: thisthisesunareferenciaalobjetoqueenvaunmensaje,osimplemente,unareferenciaalobjetoquellamaunmtodo(estenodebeserstatic).Internamentesedefine:

    final NombreClase this;porconsiguiente,nopuedemodificarse.Lasvariablesylosmtodosdelasclasesestnreferen-ciados,implcitamente,porthis.Pensemos,porejemplo,enlasiguienteclase:

    class Triangulo{ private double base; private double altura; public double area() { return base*altura/2.0 ; }}Enelmtodoarea()sehacereferenciaalasvariablesinstanciabaseyaltura.Alabase,

    alturadequobjeto?ElmtodoescomnparatodoslosobjetosTriangulo.Aparentementenodistingueentreunobjetouotro,perocadavariableinstanciaimplcitamenteestcualificadaporthis.Escomosiestuvieraescrito:

    public double area(){ return this.base*this.altura/2.0 ;}Fundamentalmente,thistienedosusos: Seleccionarexplcitamenteunmiembrodeunaclaseconelfindedarmasclaridadode

    evitarcolisindeidentificadores.Porejemplo:

    class Triangulo { private double base; private double altura; public void datosTriangulo(double base, double altura) { this.base = base; this.altura = altura; } // ... }

    Sehaevitadoconthislacolisinentreargumentosyvariablesinstancia.

  • Estructuras de datos en Java

    Queunmtododevuelvaelmismoobjetoquelollam.Deesamanera,sepuedenhacerlla-madasencascadaamtodosdelamismaclase.DenuevosedefinelaclaseTriangulo:

    class Triangulo { private double base; private double altura; public Triangulo datosTriangulo(double base, double altura) { this.base = base; this.altura = altura; return this; } public Triangulo visualizar() { System.out.println(" Base = " + base); System.out.println(" Altura = " + altura); return this; } public double area() { return base*altura/2.0 ; } }

    Ahorasepuedenconcatenarllamadasamtodos:

    Triangulo t = new Triangulo(); t.datosTriangulo(15.0,12.0).visualizar();

    .0. MIEMBrOS static dE unA CLASECadainstanciadeunaclase,cadaobjeto,tienesupropiacopiadelasvariablesdelaclase.Cuandointeresequehayamiembrosquenoestnligadosalosobjetossinoalaclasey,portanto,seancomunesatodoslosobjetos,estossedeclaranstatic.

    .0.. Variables staticLasvariablesdeclasestatic soncompartidaspor todos losobjetosde laclase.Sedeclarande igualmaneraqueotravariable, aadiendocomoprefijo lapalabra reservadastatic.Porejemplo:

    public class Conjunto{ private static int k = 0; static Totem lista = null; // ...}

  • Tipos de datos: Clases y objetos

    Lasvariablesmiembrostaticnoformanpartedelosobjetosdelaclasesinodelapropiacla-se.Dentrodelasclase,seaccedeaellasdelamanerahabitual,simplementeconsunombre.Desdefueradelaclase,seaccedeconelnombredelaclase,elselectoryelnombredelavariable:

    Conjunto.lista = ... ;

    Tambinsepuedeaccederatravsdeunobjetodelaclaseperonoesrecomendable,yaquelosmiembrosstaticnopertenecenalosobjetossinoalasclases.

    Ejercicio .Dadaunaclase,sequiereconocerentodomomentolosobjetosactivosenlaaplicacin.

    SedeclaralaclaseEjemploconunconstructorpordefectoyotroconunargumento.Ambosincrementanlavariablestatic cuentaen1.Deesamanera,cadanuevoobjetoquedacon-tabilizado.Tambinsedeclaraelmtodofinalize(),detalformaquealactivarsecuentadecreceen1.

    Elmtodomain()creaobjetosdelaclaseEjemployvisualizalavariablequecontabilizaelnmerodesusobjetos.

    class Ejemplo{ private int datos; static int cuenta = 0;

    public Ejemplo() { datos = 0; cuenta++; // nuevo objeto } public Ejemplo(int g) { datos = g; cuenta++; // nuevo objeto } // redefinicin de finalize() protected void finalize() { System.out.println("Fin de objeto Ejemplo"); cuenta--; } }

    public class ProbarEjemplo{ public static void main(String[] ar) { Ejemplo d1, d2;

    System.out.println("Objetos Ejemplo: " + Ejemplo.cuenta); d1 = new Ejemplo(); d2 = new Ejemplo(11); System.out.println("Objetos Ejemplo: " + Ejemplo.cuenta);

  • 0 Estructuras de datos en Java

    d2 = d1; System.gc(); System.out.println("Objetos Ejemplo: " + Ejemplo.cuenta);

    d2 = d1 = null; System.gc(); System.out.println("Objetos Ejemplo: " + Ejemplo.cuenta); } }

    Unavariablestaticsueleinicializarsedirectamenteenladefinicin.Sinembargo,existeuna construccin de Java que permite inicializarmiembrosstatic en un bloque de cdigodentrodelaclase;elbloquedebevenirprecedidodelapalabrastatic.Porejemplo:

    class DemoStatic{ private static int k; private static double r; private static String cmn; static { k = 1; r = 0.0; cmn = "Bloque"; }}

    .0.. Mtodos staticLosmtodosdelasclasessellamanatravsdelosobjetos.Enocasionesinteresadefinirmtodosqueestncontroladosporlaclase,demodoquenohagafaltacrearunobjetoparallamarlos:sonlosmtodosstatic.MuchosmtodosdelabibliotecaJavaestndefinidoscomostatic;es,porejemplo,elcasodelosmtodosmatemticosdelaclaseMath:Math.sin(), Math.sqrt().

    Lallamadaalosmtodosstaticserealizaatravsdelaclase:NombreClase.metodo(),respetandolasreglasdevisibilidad.Tambinsepuedenllamarconunobjetodelaclase;peronoesrecomendabledebidoaquesonmtodosdependientesdelaclaseynodelosobjetos.

    Losmtodosdefinidoscomostaticnotienenasignadalareferenciathis,porloqueslopuedenaccederamiembrosstaticdelaclase.Esunerrorqueunmtodo staticaccedaamiembrosdelaclasenostatic.Porejemplo:

    class Fiesta{ int precio; String cartel; public static void main(String[] a) { cartel = " Virgen de los pacientes"; precio = 1;

    ...

  • Tipos de datos: Clases y objetos

    al compilardadoserroresdebidoaquedesdeelmtodomain(), definidocomostatic, seaccedeamiembrosnostatic.

    Ejemplo .Laclase SumaSeriedefinetresvariablesstatic,yunmtodostaticquecalculalasumacadavezquesellama.

    class SumaSerie{ private static long n; private static long m; static { n = 0; m = 1; } public static long suma() { m += n; n = m - n; return m; }}

    .. CLASE ObjectObjecteslasuperclasebasedetodaslasclasesdeJava;todaclasedefinidaenJavaheredadelaclaseObjecty,enconsecuencia,todavariablereferenciaaunaclaseseconvierte,automtica-mente,altipoObject.Porejemplo:

    Object g;String cd = new String("Barranco la Parra");Integer y = new Integer(72); // objeto inicializado a 72g = cd; // g referencia al mismo objeto que cdg = y; // g ahora referencia a un objeto Integer

    LaclaseObjecttienedosmtodosimportantes:equals()ytoString().Generalmente,seredefinenenlasclasesparaespecializarlos.

    equals() Comparaelobjetoquehacelallamadaconelobjetoquesepasacomoargumento,devuelvetruesisoniguales.

    boolean equals(Object k);

    Elsiguienteejemplocomparadosobjetos; lacomparacinestrue sicontienen lamismacadena.

    String ar = new String("Iglesia romnica");

  • Estructuras de datos en Java

    String a = "Vida sana";if (ar.equals(a)) //...no se cumple, devuelve false

    toString() Estemtodoconstruyeunacadena,queeslarepresentacindelobjeto,ydevuelvelacadena.Normalmente,seredefineenlasclasesparadarasdetallesexplcitosdelosobjetosdelaclase.

    String toString()

    Por ejemplo, un objeto Double llama al mtodo toString() y asigna la cadena a unavariable.

    Double r = new Double(2.5);String rp;rp = r.toString();

    ... Operador instanceofConfrecuencia,senecesitaconocerlaclasedelaqueesinstanciaunobjeto.Hayquetenerencuentaque,enlasjerarquasdeclases,sedanconversionesautomticasentreclasesderivadasysuclasebase;enparticular,cualquierreferenciasepuedeconvertiraunavariabledetipoObject.

    Coneloperadorinstanceofsedeterminalaclasealaqueperteneceunobjeto,quetienedosoperandos:elprimeroesunobjetoy,elsegundo,unaclase.Evalalaexpresinatruesielprimeroesunainstanciadelsegundo.LasiguientefuncintieneunaargumentodetipoObject,porloquepuederecibircualquierreferencia,seleccionandolaclasealaqueperteneceelobjetotransmitido(String,Vector,...):

    public hacer (Object g){ if (g instanceof String) ... else if (g instanceof Vector) ...

    El operador instanceof es un operador relacional, su evaluacin da como resultado un valor de tipo boolean.

    .. tIPOS ABStrACtOS dE dAtOS En JAVALaimplementacindeunTADenJavaserealizadeformanaturalconunaclase.Dentrodelaclasevaaresidirlarepresentacindelosdatosjuntoalasoperaciones(mtodosdelaclase).Lainterfazdeltipoabstractoquedaperfectamentedeterminadaconlaetiquetapublic,queseaplicaralosmtodosdelaclasequerepresentenoperaciones.

    Porejemplo,sisehaespecificadoelTADPuntopararepresentarlaabstraccinpuntoenelespaciotridimensional,lasiguienteclaseimplementaeltipo:

    class Punto{

  • Tipos de datos: Clases y objetos

    // representacin de los datos private double x, y, z; // operaciones public double distancia(Punto p); public double modulo(); public double anguloZeta(); ...};

    ... Implementacin del tAd ConjuntoLa implementacindeunTADserealizasegn laespecificacinrealizadadel tipo.LaclaseConjuntoimplementaelTADConjunto,cuyaespecificacinseencuentraenelapartado2.3.Laclaserepresentalosdatosdeformagenrica,utilizaunarrayparaalmacenarloselementos,detipoObject.

    archivo conjunto.java

    package conjunto;

    public class Conjunto{ static int M = 20; // aumento de la capacidad private Object [] cto; private int cardinal; private int capacidad; // operaciones public Conjunto() { cto = new Object[M]; cardinal = 0; capacidad = M; } // determina si el conjunto est vaco public boolean esVacio() { return (cardinal == 0); } // aade un elemento si no est en el conjunto public void annadir(Object elemento) { if (!pertenece(elemento)) { /* verifica si hay posiciones libres, en caso contrario amplia el conjunto */ if (cardinal == capacidad) { Object [] nuevoCto; nuevoCto = new Object[capacidad + M]; for (int k = 0; k < capacidad; k++) nuevoCto[k] = cto[k]; capacidad += M; cto = nuevoCto; System.gc(); // devuelve la memoria no referenciada

  • Estructuras de datos en Java

    } cto[cardinal++] = elemento; } } // quita elemento del conjunto public void retirar(Object elemento) { if (pertenece(elemento)) { int k = 0; while (!cto[k].equals(elemento)) k++; /* desde el elemento k hasta la ltima posicin mueve los elementos una posicin a la izquierda */ for (; k < cardinal ; k++) cto[k] = cto[k+1]; cardinal--; } } //busca si un elemento pertenece al conjunto public boolean pertenece(Object elemento) { int k = 0; boolean encontrado = false; while (k < cardinal && !encontrado) { encontrado = cto[k].equals(elemento); k++; } return encontrado; } //devuelve el nmero de elementos public int cardinal() { return this.cardinal; } //operacin unin de dos conjuntos public Conjunto union(Conjunto c2) { Conjunto u = new Conjunto(); // primero copia el primer operando de la unin for (int k = 0; k < cardinal; k++) u.cto[k] = cto[k]; u.cardinal = cardinal; // aade los elementos de c2 no incluidos for (int k = 0; k < c2.cardinal; k++) u.annadir(c2.cto[k]); return u; } public Object elemento(int n) throws Exception { if (n

  • Tipos de datos: Clases y objetos

    RESuMENLostiposabstractosdedatos(TAD)describenunconjuntodeobjetosconlamismarepresen-tacinycomportamiento.Lostiposabstractosdedatospresentanunaseparacinclaraentrelainterfazexternadeuntipodedatosysuimplementacininterna.Laimplementacindeuntipoabstractodedatosestoculta.Porconsiguiente,sepuedenutilizarimplementacionesalternativasparaelmismotipoabstractodedatosincambiarsuinterfaz.

    Laespecificacindeuntipoabstractodedatossepuedehacerdemanera informal,obien,deformamasrigurosa,unaespecificacinformal.Enlaespecificacininformalsedescribenliteralmentelosdatosylafuncionalidaddelasoperaciones.Laespecificacinformaldescribelosdatos,lasintaxisylasemnticadelasoperaciones,considerandociertasoperacionescomoaxiomas,quesonlosconstructoresdenuevosdatos.Unabuenaespecificacinformaldeuntipoabstractodedatosdebepoderverificarlabondaddelaimplementacin.Enlamayoradeloslenguajesdeprogramacinorientadosaobjetos,yenparticularenJava,lostiposabstractosdedatosseimplementanmedianteclases.Unaclaseesuntipodedatodefinidoporelprogramadorquesirvepararepresentarobjetosdelmundo real.Unobjetodeunaclase tienedos componentes:unconjuntode atributosovariablesinstanciayunconjuntodecomportamientos(mtodos).Losatributostambinsellamanvariablesinstanciaomiembrosdato,yloscomportamientossellamanmtodosmiembro.

    class Circulo { private double centroX; private double centroY; private double radio; public double superficie(){} }

    Unobjetoesunainstanciadeunaclase,yunavariablecuyotiposealaclaseesunareferenciaaunobjetodelaclase.

    Circulo unCirculo; // variable del tipo clase Circulo [] tipocirculo = new Circulo[10]; // array de referencias

    Ladefinicindeunaclase,encuantoavisibilidaddesusmiembros, tienetressecciones:pblica,privadayprotegida.Laseccinpblicacontienedeclaracionesdelosatributosydelcomportamientodelobjetoquesonaccesiblesalosusuariosdelobjeto.Serecomiendaladeclaracindelosconstructoresenlaseccinpblica.Laseccinprivadacontienelosm-todosmiembroylosmiembrosdato,quesonocultosoinaccesiblesalosusuariosdelobjeto.Estosmtodosmiembroyatributosdatosonaccesiblessloporlosmtodosmiembrodelobjeto.Losmiembrosdeunaclaseconvisibilidad protected sonaccesiblesparacualquierusuariodelaclasequeseencuentreenelmismo package; tambinsonaccesiblesparalasclasesderivadas.Elaccesopordefecto,sinmodificador,tienelasmismaspropiedadesqueelacceso protected paralasclasesqueseencuentranenelmismo package.

  • Estructuras de datos en Java

    Unconstructor esunmtodomiembroconelmismonombrequesuclase.Unconstructornopuededevolveruntipoperopuedesersobrecargado.

    class complejo { public complejo(double x, double y){} public complejo(complejo z){} }

    Elconstructor esunmtodoespecialquese invocacuandosecreaunobjeto.Seutiliza,normalmente,parainicializarlosatributosdeunobjeto.Porlogeneral,almenossedefineunconstructorsinargumentos,llamadoconstructorpordefecto.Encasodenodefinirseelconstructor,implcitamentequedadefinidounconstructorsinargumentosqueinicializacadamiembronumricoa 0,losmiembrosdetipo boolean a true ylasreferenciasanull.Elprocesodecrearunobjetosellamainstanciacin(creacindeinstancia).EnJavasecreaunobjetoconeloperador new yunconstructordelaclase.

    Circulo C = new Circulo();

    EnJava,laliberacindeobjetosesautomtica;cuandounobjetodejadeestarreferenciadoporunavariableescandidatoaquelamemoriaqueocupasealiberaday,posteriormente,reutiliza-da.Elprocesosedenominagarbagecollection,elmtodo System.gc() realizaelproceso.Lospaquetessonagrupacionesdeclasesrelativasauntema.Elsistemasuministrapaquetesconclasesquefacilitanlaprogramacin.Sepuedeafirmarqueelpaquetejava.langesdondeseen-cuentranlasclasesmasutilizadas,porloqueesautomticamenteincorporadoalosprogramas.

    Losmiembrosdeunaclasedefinidoscomo static noestnligadosalosobjetosdelaclasesinoquesoncomunesatodoslosobjetos,sondelaclase.Secualificanconelnombredelaclase,porejemplo:

    Math.sqrt(x);

    EJERcicioS2.1. Realizar una especificacin informal del TAD Conjunto con las operaciones:

    ConjuntoVacio,Esvacio,Aadir un elemento al conjunto,Pertenece un elemento alconjunto,Retirarunelementodelconjunto,Uniondedosconjuntos,InterseccindedosconjuntoseInclusindeconjuntos.

    2.2. RealizarlaespecificacinformaldelTADConjuntoconlasoperacionesindicadasenelEjercicio2.1.

    ConsiderarlasoperacionesConjuntoVacioyAadircomoconstructores.

    2.3. ConstruirelTADNaturalpararepresentarlosnmerosnaturales,conlasoperacio-nes:Cero,Sucesor,EsCero,Igual,Suma,Antecesor,DiferenciayMenor.

    Realizar la especificacin informal y formal considerando comoconstructores lasoperacionesCeroySucesor.

  • Tipos de datos: Clases y objetos

    2.4. Disear el TADBolsa como una coleccin de elementos no ordenados y que pu-edenestarrepetidos.LasoperacionesdeltipoabstractosonCrearBolsa,Aadirunelemento,BolsaVacia (verificasi tieneelemento),Dentro (verificasiunelementospertenecea labolsa),Cuantos (determinaelnmerodevecesqueseencuentraunelemento),UnionyTotal.

    Realizar la especificacin informal y formal considerando comoconstructores lasoperacionesCrearBolsayAadir.

    2.5. DisearelTADComplejopararepresentarlosnmeroscomplejos.LasoperacionesquesedebendefinirsonAsignaReal(asignaunvaloralapartereal),AsignaImaginaria(asigna un valor a la parte imaginaria), ParteReal (devuelve la parte real de uncomplejo),ParteImaginaria(devuelvelaparteimaginariadeuncomplejo),ModulodeuncomplejoySumadedosnmeroscomplejos.Realizarlaespecificacininformalyformalconsiderandocomoconstructoreslasoperacionesquedesee.

    2.6. Disear el tipo abstracto de datosMatriz con la finalidad de representarmatricesmatemticas.LasoperacionesadefinirsonCrearMatriz(creaunamatriz,sinelemen-tos, demfilasporncolumnas),Asignar(asignaunelementoenlafilai,columnaj),ObtenerElemento(obtieneelelementodelafilai,ycolumnaj),Sumar(realizala sumadedosmatrices cuando tienen lasmismasdimensiones),ProductoEscalar(obtienelamatrizresultantedemultiplicarcadaelementodelamatrizporunvalor).Realizar la especificacin informal y formal considerando como constructores lasoperacionesquedesee.

    2.7. Questmalenlasiguientedefinicindelaclase? import java.io.*;

    class Buffer { private char datos[]; private int cursor ; private Buffer(int n) { datos = new char[n] }; public static int Long( return cursor;); public String contenido(){} }

    2.8. Dadoelsiguienteprograma,eslegallasentenciademain()?class Punto { public int x, int y; public Punto(int x1, int y1) {x = x1 ; y = y1;}}

    class CreaPunto{ public static void main(String [] a) {

  • Estructuras de datos en Java

    new Punto(25, 15); //es legal esta sentencia? Punto p = new Punto(); //es legal esta sentencia? }}

    2.9. Suponiendo contestado el ejercicio anterior, cul ser la salida del siguienteprograma?

    class CreaPunto{ public static void main(String [] a) { Punto q; q = new Punto(2, 1); System.out.println("x = " + p.x + "\ty = " + p.y);

    2.10. Dada lasiguienteclase,escribirelmtodofinalize()yunprogramaquecreeobjetos,despuspierdalasreferenciasalosobjetoscreadosyseactiveelmtodofinalize().class Operador{ public float memoria; public Operador(void) { System.out.println("Activar maquina operador"); memoria = 0.0F; }

    public float sumar(float f) { memoria += f; return memoria; }}

    2.11. Se desea realizar una clase Vector3d que permita manipular vectores de trescomponentes(coordenadasx, y, z)deacuerdoconlassiguientesnormas:

    Sloposeeunmtodoconstructor. Tieneunmtodomiembroequals()quepermitesabersidosvectorestienensus

    componentesocoordenadasiguales.

    2.12. IncluirenlaclaseVector3ddelEjercicio2.11elmtodonormamaxquepermitaobtenerlanormadedosvectores(Nota:Lanormadeunvectorv=x,y,zes

    2 2 2x y z+ + ).

    2.13. RealizarlaclaseComplejoquepermitalagestindenmeroscomplejos(unnmerocomplejo=dosnmerosrealesdouble:unapartereal+unaparteimaginaria).Lasoperacionesaimplementarsonlassiguientes:

    establecer()permite inicializarunobjetode tipoComplejo apartirdedoscomponentesdouble.

  • Tipos de datos: Clases y objetos

    imprimir()realizalavisualizacinformateadadeun Complejo. agregar()(sobrecargado)paraaadir,respectivamente,unComplejoaotroy

    aadirdoscomponentesdoubleaunComplejo.2.14. AadiralaclaseComplejodelEjercicio2.13lassiguientesoperaciones:

    Suma:a + c = (A+C,(B+D)i). Resta:a - c = (A-C,(B-D)i). Multiplicacin: a*c = (A*C-B*D,(A*D+B*C)i) Multiplicacin: x*c = (x*C, x*Di), donde x es real. Conjugado: a = (A ,-Bi). Siendo a = A+Bi; c = C+Di

    2.15. Implementar laclaseHora.Cadaobjetodeestaclase representaunahoraespe-cficadelda, almacenando lashoras,minutosy segundos comoenteros.Sehade incluir un constructor,mtodosde acceso, unamtodoadelantar(int h, int m, int s)paraadelantarlahoraactualdeunobjetoexistente,unmtodoreiniciar(int h, int m, int s)quereinicializalahoraactualdeunobjetoexistenteyunmtodoimprimir().

    pRoBlEMaS

    2.1. ImplementarelTADBolsadescritoenelEjercicio2.4.ProbarlaimplementacinconunprogramaqueinvoquealasoperacionesdeltipoabstractoBolsa.

    2.2. ImplementarelTADMatrizespecificadoenelEjercicio2.6.EscribirunprogramaquehaciendousodeltipoMatrizrealiceoperacionesdiversas(lectura,suma...)yescribalasmatricesgeneradas.

    2.3. ImplementarlaclaseFechaconmiembrosdatoparaelmes,dayao.Cadaobjetodeestaclaserepresentaunafecha,quealmacenaelda,mesyaocomoenteros.Sedebeincluirunconstructorpordefecto,mtodosdeacceso,unmtodoreini-ciar (int d, int m, int a)parareiniciarlafechadeunobjetoexistente,unmtodoadelantar(int d, int m, int a) paraavanzaraunafechaexistente(dia,d;mes,m;yaoa)yunmtodoimprimir().Escribirunmtododeutilidad,normalizar(), que asegure que losmiembros dato estn en el rango correcto1 ao, 1 mes 12, da das (mes),dondedas(Mes)esotromtodoquedevuelveelnmerodedasdecadames.

    2.4. Ampliarelprogramaanteriordemodoquepuedaaceptaraosbisiestos.

    Nota:unaoesbisiestosiesdivisiblepor400,osiesdivisiblepor4peronopor100.Porejemplo,losaos1992y2000sonaosbisiestosy1997y1900nosonbisiestos.