tipo de datos java-basic

Upload: mario-aquiles-miranda-olarte

Post on 12-Jul-2015

137 views

Category:

Documents


0 download

TRANSCRIPT

23capitulo 2Tipos de datos: Clases y ob]etosOb]etivosCon 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 deprogramacin.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.RESUMENEJERCICIOSPROBLEMASConceptos 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.24 Estructuras de datos en JavaNTRODUCCON Enestecaptuloseexaminanlosconceptosdemodularidadyabstraccindedatos.Lamodula-ridadeslaposibilidaddedividirunaaplicacinenpiezasmspequeasllamadasmdulos.Laabstraccindedatoseslatcnicaparainventarnuevostiposdedatosqueseanmsadecuadosaunaaplicaciny,porconsiguiente,facilitenlaescrituradelprograma.Latcnicadeabstraccindedatosesunatcnicapotentedepropsitogeneralque,cuandoseutilizaadecuadamente,puedeproducirprogramasmscortos,mslegiblesyflexibles.Loslenguajesdeprogramacinsoportanensuscompiladorestiposdedatosfundamentalesobsicos(predefinidos),talescomoint,charyfloatenJava,CyC++.Lenguajesdeprogra-macincomoJavatienencaractersticasquepermitenampliarellenguajeaadiendosuspropiostiposdedatos.Un tipo de dato definido por el programador se denomina tipo abstracto de dato, TAD, (abstract data type,ADT). El trmino abstracto se refiere al medio en que un programadorabstraealgunosconceptosdeprogramacincreandounnuevotipodedato.Lamodularizacindeunprogramautilizalanocindetipoabstractodedato(TAD)siemprequeseaposible.Siellenguajedeprogramacinsoportalostiposquedeseaelusuarioyelconjun-todeoperacionessobrecadatipo,seobtieneunnuevotipodedatodenominadoTAD.Unaclaseesuntipodedatoquecontienecdigo(mtodos)ydatos.Unaclasepermiteen-capsulartodoelcdigoylosdatosnecesariosparagestionaruntipoespecficodeunelementodeprograma,comounaventanaenlapantalla,undispositivoconectadoaunacomputadora,unafiguradeunprogramadedibujoounatarearealizadaporunacomputadora.Enestecaptuloseaprenderacrear(definiryespecificar)yautilizarclasesindividuales.2.1.AB8TRACCON EN LENGUAJE8 DE PROGRAMACONLos lenguajes de programacin son las herramientas mediante las cuales los diseadores delenguajespuedenimplementarlosmodelosabstractos.Laabstraccinofrecidaporloslenguajesdeprogramacinsepuededividirendoscategoras:abstraccindedatos(pertenecientealosdatos)yabstraccindecontrol(pertenecientealasestructurasdecontrol).Desdecomienzosdeladcadadelossesenta,cuandosedesarrollaronlosprimeroslenguajesdeprogramacindealtonivel,hasidoposibleutilizarlasabstraccionesmsprimitivasdeambascategoras(variables,tiposdedatos,procedimientos,controldebucles,etc.).2.1.1.Abstracciones de controlLos microprocesadores ofrecen directamente slo dos mecanismos para controlar el flujo yejecucin de las instrucciones: secuencia y 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 objetos25Lasabstraccionesylasestructurasdecontrolseclasificanenestructurasdecontrolaniveldesentenciayaniveldeunidades.Lasabstraccionesdecontrolaniveldeunidadseconocencomoabstraccionesprocedimentales.abstraccin procedimental (por procedimientos)Es esencial para disear software modular y fiable la abstraccin procedimental que se basaenlautilizacindeprocedimientosofuncionessinpreocuparsedecmoseimplementan.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 ycualquier otra definicin local se encapsulan en el subprograma, ocultndose de formaque no pueden utilizarse fuera del subprograma. Por consiguiente, el programador notienequepreocuparsesobrelasdefinicioneslocales. Losparmetrosdelossubprogramas,juntoconlaocultacindelainformacinanterior,permitencrearsubprogramasqueconstituyenentidadesdesoftwarepropias.Losdetalleslocalesdelaimplementacinpuedenestarocultos,mientrasquelosparmetrossepuedenutilizarparaestablecerlainterfazpblica.EnJava,laabstraccinprocedimentalseestablececonlosmtodosofuncionesmiembrosdeclases.otros mecanismos de abstraccin de controlLa evolucin de los lenguajes de programacin ha permitido la aparicin de otros mecanismosparalaabstraccindecontrol,comomanejodeexcepciones,corrutinas,unidadesconcurrentesoplantillas(templates).Estasconstruccionessonsoportadasporloslenguajesdeprogramacinbasadosyorientadosaobjetos,comoJava,Modula-2,Ada,C++,SmalltalkoEiffel.2.1.2.Abstracciones de datosLosprimerospasoshacialaabstraccindedatossecrearonconlenguajestalescomoFORTRAN,COBOL y ALGOL 60, con la introduccin de tipos de variables diferentes, que manipulabanenteros, nmeros reales, caracteres, valores lgicos, etc. Sin embargo, estos tipos de datos nopodansermodificadosynosiempreseajustabanaltipodeunoparaelquesenecesitaban.Porejemplo,eltratamientodecadenasesunadeficienciaenFORTRAN,mientrasquelaprecisinyfiabilidadparaclculosmatemticosesmuyalta.Lasiguientegeneracindelenguajes,incluyendoPascal,SIMULA-67yALGOL68,ofre-ciunaampliaseleccindetiposdedatosypermitialprogramadormodificaryampliarlostiposdedatosexistentesmedianteconstruccionesespecficas(porejemplo,arraysyregistros).Adems,SIMULA-67fueelprimerlenguajequemezcldatosyprocedimientosmediantelaconstruccindeclases,queeventualmenteseconvirtienlabasedeldesarrollodeprograma-cinorientadaaobjetos.26 Estructuras de datos en JavaLaabstraccindedatoseslatcnicadeprogramacinquepermiteinventarodefinirnuevostiposdedatos(tiposdedatosdefinidosporelusuario)adecuadosalaaplicacinquesedesearealizar.Laabstraccindedatosesunatcnicamuypotentequepermitedisearprogramasmscortos,legiblesyflexibles.Laesenciadelaabstraccinessimilaralautilizacindeuntipodedato,cuyousoserealizasintenerencuentacmoestrepresentadooimplementado.Lostiposdedatossonabstraccionesyelprocesodeconstruirnuevostipossellamaabstrac-cindedatos.Losnuevostiposdedatosdefinidosporelusuariosellamantiposabstractosdedatos.El concepto de tipo, tal como se defini en Pascal y ALGOL 68, ha constituido un hitoimportante para la realizacin de un lenguaje capaz de soportar programacin estructurada.Sin embargo, estos lenguajes no soportan totalmente una metodologa orientada a objetos. Laabstraccindedatostilparaestepropsitonosloclasificaobjetosdeacuerdoasuestructuraderepresentacin,sinoquelosclasificandeacuerdoalcomportamientoesperado.Talcompor-tamientoesexpresableentrminosdeoperacionesquesonsignificativassobreesosdatos,ylasoperacionessonelnicomedioparacrear,modificaryaccederalosobjetos.En trminos ms precisos, Ghezzi indica que un tipo de dato definible por el usuario sedenominatipoabstractodedato(TAD)si: Existeunaconstruccindellenguajequelepermiteasociarlarepresentacindelosdatosconlasoperacionesquelomanipulan; Larepresentacindelnuevotipodedatoestocultadelasunidadesdeprogramaqueloutilizan[GHEzzI87].Las clases de Java o de C++ cumplen las dos condiciones: agrupan los datos junto a lasoperaciones,ysurepresentacinquedaocultadeotrasclases.Lostiposabstractosdedatosproporcionanunmecanismoadicionalmedianteelcualsereali-zaunaseparacinclaraentrelainterfazylaimplementacindeltipodedato.Laimplementacindeuntipoabstractodedatoconstade:1. Larepresentacin:eleccindelasestructurasdedatos.2. Lasoperaciones:eleccindelosalgoritmos.LainterfazdeltipoabstractodedatoseasociaconlasoperacionesydatosvisiblesalexteriordelTAD.2.2.TPO8 AB8TRACTO8 DE DATO8Algunoslenguajesdeprogramacintienencaractersticasquenospermitenampliarellenguajeaadiendosuspropiostiposdedatos.Untipodedatodefinidoporelprogramadorsedenominatipoabstractodedatos(TAD)paradiferenciarlodeltipofundamental(predefinido)dedatos.Porejemplo,enJava,eltipoPunto,querepresentalascoordenadasxeydeunsistemadecoorde-nadas rectangulares, no existe. Sin embargo, es posible implementar el tipo abstracto de datos,considerandolosvaloresquesealmacenanenlasvariablesyquoperacionesestndisponiblesparamanipularestasvariables.Enesencia,untipoabstractoesuntipodedatoqueconstadedatos(estructurasdedatospropias)yoperacionesquesepuedenrealizarsobreellos.UnTADsecom-ponedeestructurasdedatosylosprocedimientosofuncionesquemanipulanesasestructurasdedatos.Tipos de datos: Clases y objetos27Para recordarUn tipo abstracto de datos puede defnirse mediante la ecuacin:taD = Representacin (datos) + Operaciones (funciones y procedimientos)Laestructuradeuntipoabstractodedato(clase),desdeunpuntodevistaglobal,secomponedelainterfazydelaimplementacin(Figura2.1).Lasestructurasdedatosrealeselegidasparaalmacenarlarepresentacindeuntipoabstractodedatossoninvisiblesalosusuariosoclientes.LosalgoritmosutilizadosparaimplementarcadaunadelasoperacionesdelosTADestnencapsuladasdentrodelospropiosTAD.Lacaracters-ticadeocultamientodelainformacinsignificaquelosobjetostieneninterfacespblicas.Sinembargo,lasrepresentacioneseimplementacionesdeesasinterfacessonprivadas.Figura 2.1 Estructura de un tipo abstracto de datos (TAD)2.2.1.Venta]as de los tipos abstractos de datosUntipoabstractodedatosesunmodelo(estructura)conunnmerodeoperacionesqueafectanaesemodelo.Lostiposabstractosdedatosproporcionannumerososbeneficiosalprogramador,quesepuedenresumirenlossiguientes:1. Permiten una mejor conceptualizacin y modelizacin del mundo real. Mejoran larepresentacinylacomprensibilidad.Clarificanlosobjetosbasadosenestructurasycomportamientoscomunes.28 Estructuras de datos en Java2. Mejoranlarobustezdelsistema.Sihaycaractersticassubyacentesenloslenguajes,per-mitenlaespecificacindeltipodecadavariable.Lostiposabstractosdedatospermitenlacomprobacindetiposparaevitarerroresdetipoentiempodeejecucin.3. Mejoranelrendimiento(prestaciones).Parasistemastipeados(tipificados),elconoci-mientodelosobjetospermitelaoptimizacindetiempodecompilacin.4. Separanlaimplementacindelaespecificacin.Permitenlamodificacinylamejoradelaimplementacinsinafectarlainterfazpblicadeltipoabstractodedato.5. Permiten la extensibilidad del sistema. Los componentes de software reutilizables sonmsfcilesdecrearymantener.6. Recogenmejorlasemnticadeltipo.Lostiposabstractosdedatosagrupanolocalizanlasoperacionesylarepresentacindeatributos.UnprogramaquemanejaunTADlohaceteniendoencuentalasoperacionesolafunciona-lidadquetiene,sininteresarseporlarepresentacinfsicadelosdatos.Esdecir,losusuariosdeunTADsecomunicanconsteapartirdelainterfazqueofreceelTADmediantefuncionesdeacceso.PodracambiarselaimplementacindeltipodedatosinafectaralprogramaqueusaelTADyaqueparaelprogramaestoculta.2.2.2.mplementacin de los TADLasunidadesdeprogramacindelenguajesquepuedenimplementarunTADrecibendistintosnombres:Modula-2 mduloAda paqueteC++ claseJava claseEnestoslenguajessedefinenlaespecificacindelTAD,quedeclaralasoperacionesylosdatos, y la implementacin, que muestra el cdigo fuente de las operaciones, que permaneceocultoalexteriordelmdulo.2.3.E8PECFCACON DE LO8 TADElobjetivodelaespecificacinesdescribirelcomportamientodelTAD;constadedospartes,la descripcin matemtica del conjunto de datos y la de las operaciones definidas en ciertoselementosdeeseconjuntodedatos.LaespecificacindelTADpuedetenerunenfoqueinformal,quedescribelosdatosylasoperaciones relacionadas en lenguaje natural. Otro enfoque mas riguroso, la especificacinformal, supone suministrar un conjunto de axiomas que describen las operaciones en su as-pectosintcticoysemntico.2.3.1.Especificacin informal de un TADConstadedospartes: Detallarenlosdatosdeltipolosvaloresquepuedentomar. Describirlasoperacionesrelacionndolasconlosdatos.Tipos de datos: Clases y objetos29Elformatoquegeneralmenteseemplea,primeroespecificaelnombredelTADylosdatos:TADnombredeltipo(valoresysudescripcin)Acontinuacincadaunadelasoperacionesconsusargumentos,yunadescripcinfuncionalenlenguajenatural,conesteformato:Operacin(argumentos) Descripcin funcionalComoejemplo,sevaaespecificareltipoabstractodedatosConjunto:TADConjunto(coleccindeelementossinduplicidades,puedenestarencualquierorden,seusapararepresentarlosconjuntosmatemticosconsusoperaciones).Operaciones,seponenlasoperacionesbsicassobreconjuntos:Conjuntovacio.Creaunconjuntosinelementos.Aadir(Conjunto,elemento).Comprueba si el elemento forma parte 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.2.3.2.Especificacin formal de un TADLaespecificacinformalproporcionaunconjuntodeaxiomasquedescribenelcomportamientodetodaslasoperaciones.Ladescripcinhadeincluirunapartedesintaxis,encuantoalostipos30 Estructuras de datos en Javadelosargumentosyaltipodelresultado,yunapartedesemntica,dondesedetallalaexpresindelresultadoqueseobtieneparaunosvaloresparticularesdelosargumentos.LaespecificacinformalhadeserlobastantepotenteparaquecumplaelobjetivodeverificarlacorreccindelaimplementacindelTAD.ElesquemaquesigueconstadeunacabeceraconelnombredelTADylosdatos:TAD nombre del tipo (valores que toma los datos del tipo)Lesiguelasintaxisdelasoperaciones,quelistalasoperacionesmostrandolostiposdelosargumentosyeltipodelresultado:SintaxisOperacin(Tipo argumento, ...)-> Tipo resultado A continuacin se explica la semntica de las operaciones. sta se construye dando unosvaloresparticularesalosargumentosdelasoperaciones,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)-> ConjuntoRetirar(Conjunto, Elemento)-> ConjuntoPertenece(Conjunto, Elemento) -> booleanEsvacio(Conjunto)-> booleanCardinal(Conjunto) -> enteroUnion(Conjunto, Conjunto)-> ConjuntoSemntica e1,e2 Elemento y C,D ConjuntoAadir(Aadir(C, e1), e1) Aadir(C, e1)Aadir(Aadir(C, e1), e2) Aadir(Aadir(C, e2), e1) Retirar(Conjuntovacio, e1) ConjuntovacioRetirar(Aadir(C, e1), e2) si e1 = e2 entonces Retirar(C,e2)sino Aadir(Retirar(C,e2),e1)Tipos de datos: Clases y objetos31Pertenece(Conjuntovacio, e1) falsoPertenece(Aadir(C, e2), e1) si e1 = e2 entonces ciertosino Pertenece(C, e1)Esvacio(Conjuntovacio) ciertoEsvacio(Aadir(C, e1)) falsoCardinal(Conjuntovacio) CeroCardinal(Aadir(C, e1)) si Pertenece(C,e1) entonces Cardinal(C) sino 1 + Cardinal(C)Union(Conjuntovacio,Conjuntovacio) ConjuntovacioUnion(Conjuntovacio,Aadir(C, e1)) Aadir(C, e1)Union(Aadir(C, e1), D) Aadir(Union(C, D), e1)2.4.CLA8E8 Y OBJETO8Elparadigmaorientadoaobjetosnacien1969delamanodeldoctornoruegoKristinNygaard,quealintentarescribirunprogramadecomputadoraquedescribieraelmovimientodelosbarcosatravsdeunfiordo,descubriqueeramuydifcilsimularlasmareas,losmovimientosdelosbarcosylasformasdelalneadelacostaconlosmtodosdeprogramacinexistentesenesemomento.Descubriqueloselementosdelentornoquetratabademodelarbarcos,mareasylneadelacostadelosfiordosylasaccionesquecadaelementopodaejecutarmantenanunasrelacionesqueeranmsfcilesdemanejar.Las tecnologas orientadas a objetos han evolucionado mucho, pero mantienen la razn deserdelparadigma:combinacindeladescripcindeloselementosenunentornodeprocesodedatosconlasaccionesejecutadasporesoselementos.Lasclasesylosobjetos,comoinstanciasoejemplaresdeellas,sonloselementosclavesobrelosquesearticulalaorientacinaobjetos.2.4.1.Ou son ob]etos?Enelmundoreal,laspersonasidentificanlosobjetoscomocosasquepuedenserpercibidasporlos cinco sentidos. Los objetos tienen propiedades especficas, como posicin, tamao, color,forma,textura,etc.quedefinensuestado.Losobjetostambinposeenciertoscomportamientosqueloshacendiferentesdeotrosobjetos.Booch1defineunobjetocomoalgoquetieneunestado,uncomportamientoyunaidenti-dad.Imaginemosunamquinadeunafbrica.Elestadodelamquinapuedeestarfuncionan-do/parando(on/off),hayquetenerencuetasupotencia,velocidadmxima,velocidadactual,temperatura,etc.Sucomportamientopuedeincluiraccionesparaarrancarypararlamquina,obtener su temperatura, activar o desactivar otras mquinas, conocer las condiciones de sealdeerrorocambiarlavelocidad.Suidentidadsebasaenelhechodequecadainstanciadeunamquinaesnica,talvezidentificadaporunnmerodeserie.Lascaractersticasqueseeligenparaenfatizarelestadoyelcomportamientoseapoyarnencmounobjetomquinaseutilizarenunaaplicacin.Enundiseodeunprogramaorientadoaobjetos,secreaunaabstraccin(unmodelosimplificado)delamquinabasadaenlaspropiedadesyenelcomportamientoquesontileseneltiempo.

1 Booch, Grady. Anlisis y diseo orientado a objetos con aplicaciones. Madrid: Daz de Santos/Addison-Wesley,1995(librotraducidoalespaolporlosprofesoresCuevayJoyanes).32 Estructuras de datos en JavaMartinyOdelldefinenunobjetocomocualquiercosa,realoabstracta,enlaquesealmace-nandatosyaquellosmtodos(operaciones)quemanipulanlosdatos.Pararealizaresaactividad,seaadenacadaobjetodelaclaselospropiosdatosasociadosconsuspropiosmtodosmiembroquepertenecenalaclase.Unmensajeesunainstruccinqueseenvaaunobjetoyque,cuandoserecibe,ejecutasusacciones.Unmensajeincluyeunidentificadorquecontienelaaccinquehadeejecutarelobjetojuntoconlosdatosquenecesitaelobjetopararealizarsutrabajo.Losmensajes,porconsiguiente,formanunaventanadelobjetoalmundoexterior.Elusuariodeunobjetosecomunicaconelobjetomediantesuinterfaz,unconjuntodeope-raciones definidas por la clase del objeto de modo que sean todas visibles al programa. Unainterfazsepuedeconsiderarcomounavistasimplificadadeunobjeto.Porejemplo,undispositivoelectrnico como una mquina de fax tiene una interfaz de usuario bien definida; por ejemplo,esainterfazincluyeelmecanismodeavancedelpapel,botonesdemarcado,elreceptoryelbotnenviar.Elusuarionotienequeconocercmoestconstruidalamquinainternamente,elpro-tocolodecomunicacionesuotrosdetalles.Dehecho,laaperturadelamquinaduranteelperiododegarantapuedeanularla.2.4.2.Ou son clases?Entrminosprcticos,unaclaseesuntipodefinidoporelusuario.Lasclasessonlosbloquesdeconstruccinfundamentalesdelosprogramasorientadosaobjetos.Boochdefineunaclasecomounconjuntodeobjetosquecompartenunaestructurayuncomportamientocomunes.Unaclasecontienelaespecificacindelosdatosquedescribenunobjetojuntoconladescrip-cindelasaccionesqueunobjetoconocecmohadeejecutar.Estasaccionesseconocencomoservicios o mtodos. Una clase incluye tambin todos los datos necesarios paradescribir losobjetoscreadosapartirdelaclase.Estosdatosseconocencomoatributos,variablesovariablesinstancia. El trmino atributo se utiliza en anlisis y diseo orientado a objetos, y el trminovariableinstanciasesueleutilizarenprogramasorientadosaobjetos.2.5.DECLARACON DE UNA CLA8EAntes de que un programa pueda crear objetos de cualquier clase, sta debe ser definida. Ladefinicin de una clase significa que se debe dar a la misma un nombre, dar nombre tambina los elementos que almacenan sus datos y describir los mtodos que realizarn las accionesconsideradasenlosobjetos.Las definiciones o especificaciones no son un cdigo de programa ejecutable. Se utilizanparaasignaralmacenamientoalosvaloresdelosatributosusadosporelprogramayreconocerlosmtodosqueutilizarelprograma.Normalmente,sesitanenarchivosformandolosdeno-minadospackages,seutilizaunarchivoparavariasclasesqueestnrelacionadas.Formatoclass NombreClase{lista_de_miembros}Tipos de datos: Clases y objetos33NombreClaseNombredefinidoporelusuarioqueidentificalaclase(puedeincluirletras,nmerosysubrayados).lista _ de _ miembros mtodosydatosmiembrosdelaclase.E]emplo 2.1DefinicindeunaclasellamadaPuntoquecontienelascoordenadasxeydeunpuntoenunplano.class Punto{private int x;// coordenada xprivate int y;// coordenada ypublic Punto(int x _ , int y _ )// constructor{x = x _ ;y = y _ ;}public Punto()// constructor sin argumentos{x = y = 0;}publicint leerX()// devuelve el valor de x{return x;} publicint 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;}}E]emplo 2.2DeclaracindelaclaseEdad.class Edad{private int edadHijo, edadMadre, edadPadre; datospublic Edad(){...}mtodo especial: constructorpublic void iniciar(int h,int e,int p){...} mtodospublic int leerHijo(){...}34 Estructuras de datos en Javapublic int leerMadre(){...}public int leerPadre(){...}}2.5.1.Ob]etos 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,elconstructor notieneargumentos, sepuedecrearunobjeto:Edad f = new Edad();Eloperadordeaccesoaunmiembro(.)seleccionaunmiembroindividualdeunobjetodelaclase.Porejemplo:Punto p;p = new Punto();p.fijarX (100);System.out.println(" Coordenadax 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 referenciahoy = new DiaSemana(); // se ha creado un objetohoy.visualizar();// llama al mtodo visualizar()Tipos de datos: Clases y objetos352.5.2.Visibilidad de los miembros de la clase Unprincipiofundamentalenprogramacinorientadaaobjetoseslaocultacindelainfor-macin,quesignificaqueadeterminadosdatosdelinteriordeunaclasenosepuedeaccederpor mtodos externos a ella. El mecanismo principal para ocultar datos es ponerlos en unaclaseyhacerlosprivados.Alosdatosomtodosprivadosslosepuedeaccederdesdedentrodelaclase.Porelcontrario,losdatosomtodospblicossonaccesiblesdesdeelexteriordelaclase.Noaccesiblesdesdeelexteriordelaclase(accesodenegado)PrivadoDatosoMtodosAccesibledesdeelexteriordelaclasePblicoDatosoMtodosFigura 2.2 Secciones pblica y privada de una claseParacontrolarelaccesoalosmiembrosdelaclaseseutilizantresespecificadoresdeacceso:public,privateyprotected.Cadamiembrodelaclaseestprecedidodelespecificadordeaccesoquelecorresponde.Formatoclass NombreClase{private declaracin miembro privado; // miembros privadosprotected declaracin miembro protegido;// miembros protegidospublic declaracin miembro pblico;// miembros pblicos}Elespecificadorpublicdefinemiembrospblicos,quesonaquellosalosquesepuedeac-cederporcualquiermtododesde fuera de laclase.Alosmiembrosque siguen al especificadorprivate slo se puede acceder por mtodos miembros de la misma clase.A los miembros quesiguenalespecificadorprotectedsepuedeaccederpormtodosmiembrodelamismaclaseodeclasesderivadas,ascomopormtodosdeotrasclasesqueseencuentranenelmismopaquete.Losespecificadorespublic,protectedyprivatepuedenaparecerencualquierorden.Sinoseespecificaacceso(accesopordefecto)aunmiembrodeunaclase,astesepuedeaccederdesdelosmtodosdelaclaseydesdecualquiermtododelasclasesdelpaqueteenelqueseencuentra.E]emplo 2.3DeclaracindelaclaseFotoyMarcoconmiembrosdeclaradoscondistintavisibilidad.Ambasclasesformanpartedelpaquetesoporte.36 Estructuras de datos en Javapackage 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 2.1 Visibilidad, x indica que el acceso est permitidotipo de miembroMiembro de la misma claseMiembro de una clase derivadaMiembro de clase del paqueteMiembro de clase de otro paquetePrivate xEn blanco x xProtected x x xPublicx x x xAunquelasespecificacionespblicas,privadasyprotegidaspuedenaparecerencualquierorden,enJavalosprogramadoressuelenseguirciertasreglaseneldiseoquecitamosaconti-nuacin,paraqueustedpuedaelegirlaqueconsideremseficiente.1. Ponerlosmiembrosprivadosprimero,debidoaquecontienenlosatributos(datos).2. Colocarlosmiembrospblicosprimero,debidoaquelosmtodosylosconstructoressonlainterfazdelusuariodelaclase.En realidad, tal vez el uso ms importante de los especificadores de acceso es implementarla ocultacin de la informacin. El principio de ocultacin de la informacin indica que todala interaccin con un objeto se debe restringir a utilizar una interfaz bien definida que permitaignorarlosdetallesdeimplementacindelosobjetos.Porconsiguiente,losdatosylosmtodosTipos de datos: Clases y objetos37pblicosformanlainterfazexternadelobjeto,mientrasqueloselementosprivadossonlosas-pectos internos que nonecesitanser accesiblespara usar elobjeto.Loselementosdeuna clasesinespecificadorylosprotectedtienenlasmismaspropiedadesquelospblicosrespectoalasclasesdelpaquete.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.2.5.3.Mtodos de una claseLasmtodosenJavasiempresonmiembrosdeclases,nohaymtodosofuncionesfueradelasclases.Laimplementacindelosmtodosseincluyedentrodelcuerpodelaclase.LaFigura2.3muestraladeclaracincompletadeunaclase.?Encapsulacin.Figura 2.3 Definicin tpica de una claseE]emplo 2.4LaclaseRacionaldefineelnumeradoryeldenominadorcaractersticosdeunnmeroracional.Porcadadatoseproporcionaunmtodomiembroquedevuelvesuvaloryunmtodoqueasignanumeradorydenominador.Tieneunconstructorqueinicializaunobjetoa0/1.class Racional{private int numerador;private int denominador;public Racional(){ numerador = 0;denominador = 1;}38 Estructuras de datos en Javapublic int leerN() { return numerador; }public int leerD() { return denominador; }publicvoid fijar (int n, int d){numerador = n;denominador = d;}}E]ercicio 2.1Definir una clase DiaAnyo que contenga los atributos mes y da, el mtodo igual() 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;elsereturn false;}// muestra en pantalla el mes y el dapublic 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 objetos39System.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 ! ");elseSystem.out.println( "Feliz dia ! ");}}2.5.4.mplementacin de las clasesElcdigofuentedeladefinicindeunaclase,contodossusmtodosyvariablesinstanciaseal-macenaenarchivosdetextoconextensin.javayelnombredelaclase,porejemplo,Racional.java.Normalmente,sesitalaimplementacindecadaclaseenunarchivoindependiente.Lasclasespuedenprocederdediferentesfuentes: Se pueden declarar e implementar sus propias clases. El cdigo fuente siempre estardisponible;puedenestarorganizadasporpaquetes. Sepuedenutilizarclasesquehayansidoescritasporotraspersonasoinclusoquesehayancomprado.Enestecaso,sepuededisponerdelcdigofuenteoestarlimitadoautilizarelbytecodedelaimplementacin.Sernecesariodisponerdelpaquetedondeseencuentran. Se pueden utilizar clases de los diversos packages que acompaan a su software dedesarrolloJava.2.5.5.Clases pblicasLadeclaracindeunaclasepuedeincluirelmodificadorpubliccomoprefijoenlacabeceradelaclase.Porejemplo:public class Examen{// miembros de la clase}LaclaseExamenpuedeserutilizadaporlasclasesqueseencuentranensumismoarchivo(package),oporclasesdecualquierotropaqueteoarchivo.Habitualmente,lasclasessedefinen40 Estructuras de datos en Javacomopublic,anoserquesequierarestringirsuusoalasclasesdelpaquete.Unaclasedecla-radasinelprefijopublicestableceunarestriccinimportante,yesqueslopodrserutilizadaporlasclasesdefinidasenelmismopaquete.AdvertenciaEl especificador de acceso public es el nico que se puede especificar en la cabecera de una clase.2.6.PAOUETE8LospaquetessonlaformaquetieneJavadeorganizarlosarchivosconlasclasesnecesariasparaconstruirlasaplicaciones.Javaincorporavariospaquetes,porejemplojava.lang ojava.io,conlasclasesbsicasparaconstruirprogramas:System, String, Integer ...2.6.1.8entencia packageCmo se puede definir un paquete? La sentencia package se utiliza para este cometido. Enprimerlugarsedebeincluirlasentenciapackagecomoprimeralneadelarchivofuentedecadauna de las clases del paquete. Por ejemplo, si las clases Lapiz, Boligrafo y Folio se van aorganizarformandoelpaqueteescritorio,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 objetos41Formatopackage NombrePaquete;Ensegundolugar,unavezcreadoelarchivofuentedecadaclasedelpaquete,sedebenubicarcadaunoenunsubdirectorioconelmismonombrequeeldelpaquete.EnelesquemaanteriorseubicarnlosarchivosLapiz.java,Boligrafo.javayFolio.javaenelcaminoescritorio.Elusodepaquetestienedosbeneficiosimportantes:1. Lasrestriccionesdevisibilidadsonmenoresentreclasesqueestndentrodelmismopaquete.Desdecualquierclasedeunpaquete,losmiembrosprotectedylosmiembrossinmodifi-cadordevisibilidadsonaccesibles,peronolosondesdeclasesdeotrospaquetes.2. Laseleccindelasclasesdeunpaquetesepuedeabreviarconlasentenciaimportdelpaquete.2.6.2.mportLasclasesqueseencuentranenlospaquetesseidentificanutilizandoelnombredelpaquete,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:Formatoimport identificadorpaquete.nombreClase;import identificadorpaquete.*;Elprimerformatoespecificaunaclaseconcreta.Elsegundoformatoindicaqueparatodaslasclasesdeunpaquetenohacefaltacualificarelnombredelaclaseconelnombredelpaquete.42 Estructuras de datos en JavaConfrecuenciaseutilizaelformato.*.Tienelaventajadepodersimplificarcualquierclasedelpaquete,perosepuedensealarlossiguientesproblemas: Se desconoce qu clases concretas del paquete se estn utilizando. Por contra, con unasentenciaimportporcadaclaseutilizadaseconocenlasclasesempleadas. Puede haber colisiones entre nombres de clases declaradas en el archivo y nombres declasesdelpaquete. Mayortiempodecompilacin,debidoaqueelcompiladorbuscalaexistenciadecualquierclaseenelpaquete.NotaAunque aparezca la sentencia import paquete.*, el compilador genera bytecode slo para las clases utilizadas.E]emplo 2.5SecreaelpaquetenumericoconlaclaseRandomyseutilizalaclaseenunaaplicacin.package numerico;public Random{// ...}Alutilizarlaclaseenotroarchivo:import java.util.*import numerico.*;Enelpaquetejava.utilseencuentralaclaseRandom,porelloseproduceunaambigedadconlaclaseRandomdelpaquetenumerico.EsnecesariocualificarcompletamenteelnombredelaclaseRandomde,porejemplo,java.util.java.util.Random aleatorio; // define una referencia2.7.CON8TRUCTORE8Unconstructoresunmtodoqueseejecutaautomticamentecuandosecreaunobjetodeunaclase.Sirveparainicializarlosmiembrosdelaclase.Elconstructortieneelmismonombrequelaclase.Cuandosedefinenosepuedeespecificarunva-lorderetorno,nuncadevuelveunvalor.Sinembargo,puedetomarcualquiernmerodeargumentos.Reglas1.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 objetos43E]emplo 2.6LaclaseRectangulotieneunconstructorconcuatroparmetros.public class Rectangulo{private int izdo;private int superior;private int dcha;private int inferior;// constructorpublic 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.2.7.1.Constructor por defectoUn constructor que no tiene parmetros se llama constructor por defecto. Un constructor pordefectonormalmenteinicializalosmiembrosdatodelaclaseconvalorespordefecto.ReglaJavacreaautomticamenteunconstructorpordefectocuandonoexistenotroscons-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.E]emplo 2.7Elconstructorpordefectoinicializaxeya0.public class Punto{private int x;private int y;public Punto()// constructor por defecto{x = 0;44 Estructuras de datos en Javay = 0;}}CuandosecreaunobjetoPunto,susmiembrosdatoseinicializana0.Punto P1 = new Punto() ; // P1.x == 0, P1.y == 0PrecaucinTenga 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.2.7.2.Constructores sobrecargadosAl igual que se puede sobrecargar un mtodo de una 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.E]emplo 2.8Laclase EquipoSonido sedefinecontresconstructores:unopordefecto,otroconunargumentodetipocadenayeltercerocontresargumentos.public class EquipoSonido{private int potencia;private int voltios;private int numCd;private String marca;publicEquipoSonido() // 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 objetos45potencia = 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);2.8.RECOLECCON DE OBJETO8EnJava,unobjetosiemprehadeestarreferenciadoporunavariable;enelmomentoenqueunobjetodejadeestarreferenciado,seactivalarutinaderecoleccindememoria,sepuededecirqueelobjetoesliberadoylamemoriaqueocupapuedeserreutilizada.Porejemplo:Punto p = new Punto(1,2);lasentencia p = nullprovocaqueelobjetoPuntosealiberadoautomticamente.El propio sistema se encarga de recolectar los objetos en desuso para aprovechar la me-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 objetosk = 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 alobjeto. */ 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 46 Estructuras de datos en Java2.8.1.Mtodo finalize()El mtodo finalize() es especial, se llama automticamente si ha sido definido en la clase,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.E]ercicio 2.2Sedeclarandosclases,cadaunaconsumtodofinalize().Elmtodomain()creaobjetosdeambasclases;lasvariablesquereferencianalosobjetossemodificanparaquecuandoseactivelarecoleccinautomticadeobjetosseliberelamemoriadeestos;hayunallamadaaSystem.gc()paranoesperaralallamadainternadelsistema.class Demo{privateint datos;publicDemo(){datos = 0;} protected void finalize(){System.out.println("Fin de objeto Demo");} }class Prueba{privatedouble x;publicPrueba (){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 objetoTipos de datos: Clases y objetos47p2 = p1;p1 = new Prueba();System.gc();// no se libera ningn objetop1 = null;d1 = new Demo();System.gc();// se liberan dos objetosd2 = new Demo();}// se liberan los objetos restantes }2.9.OBJETO OUE ENVA EL MEN8AJE: 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: Seleccionarexplcitamenteunmiembrodeunaclaseconelfindedarmasclaridadodeevitarcolisindeidentificadores.Porejemplo:class Triangulo{private double base;private double altura;public void datosTriangulo(double base, double altura){this.base = base;this.altura = altura;}// ...}Sehaevitadoconthislacolisinentreargumentosyvariablesinstancia.48 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();2.10.MEMBRO8 static DE UNA CLA8ECadainstanciadeunaclase,cadaobjeto,tienesupropiacopiadelasvariablesdelaclase.Cuandointeresequehayamiembrosquenoestnligadosalosobjetossinoalaclasey,portanto,seancomunesatodoslosobjetos,estossedeclaranstatic.2.10.1.Variables staticLas variables de clase static son compartidas por todos los objetos de la clase. Se declarande igual manera que otra variable, aadiendo como prefijo la palabra reservada static. Porejemplo:public class Conjunto{private static int k = 0;static Totem lista = null;// ...}Tipos de datos: Clases y objetos49Lasvariablesmiembrostaticnoformanpartedelosobjetosdelaclasesinodelapropiacla-se.Dentrodelasclase,seaccedeaellasdelamanerahabitual,simplementeconsunombre.Desdefueradelaclase,seaccedeconelnombredelaclase,elselectoryelnombredelavariable:Conjunto.lista = ... ;Tambinsepuedeaccederatravsdeunobjetodelaclaseperonoesrecomendable,yaquelosmiembrosstaticnopertenecenalosobjetossinoalasclases.E]ercicio 2.3Dadaunaclase,sequiereconocerentodomomentolosobjetosactivosenlaaplicacin.SedeclaralaclaseEjemploconunconstructorpordefectoyotroconunargumento.Ambosincrementanlavariablestatic cuentaen1.Deesamanera,cadanuevoobjetoquedacon-tabilizado.Tambin se declara el mtodo finalize(), de tal forma que al activarse cuentadecreceen1.Elmtodomain()creaobjetosdelaclaseEjemployvisualizalavariablequecontabilizaelnmerodesusobjetos.class Ejemplo{privateint datos;static int cuenta = 0;publicEjemplo(){datos = 0;cuenta++;// nuevo objeto} publicEjemplo(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);50 Estructuras de datos en Javad2 = 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 inicializar miembros static 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";}}2.10.2.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 objetos51al compilar da dos errores debido a que desde el mtodo main(), definido como static, seaccedeamiembrosnostatic.E]emplo 2.9Laclase 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;}}2.11.CLA8E 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 IntegerLaclaseObjecttienedosmtodosimportantes:equals()ytoString().Generalmente,seredefinenenlasclasesparaespecializarlos.equals() Comparaelobjetoquehacelallamadaconelobjetoquesepasacomoargumento,devuelvetruesisoniguales.boolean equals(Object k);El siguiente ejemplo compara dos objetos; la comparacin es true si contienen la mismacadena.String ar = new String("Iglesia romnica");52 Estructuras de datos en JavaString a = "Vida sana";if (ar.equals(a)) //...no se cumple, devuelve falsetoString() Este mtodo construye una cadena, que es la representacin del objeto, y devuelve la cadena.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();2.11.1.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. 2.12.TPO8 AB8TRACTO8 DE DATO8 EN JAVALaimplementacindeunTADenJavaserealizadeformanaturalconunaclase.Dentrodelaclasevaaresidirlarepresentacindelosdatosjuntoalasoperaciones(mtodosdelaclase).Lainterfazdeltipoabstractoquedaperfectamentedeterminadaconlaetiquetapublic,queseaplicaralosmtodosdelaclasequerepresentenoperaciones.Porejemplo,sisehaespecificadoelTADPuntopararepresentarlaabstraccinpuntoenelespaciotridimensional,lasiguienteclaseimplementaeltipo:class Punto{Tipos de datos: Clases y objetos53// representacin de los datosprivate double x, y, z;// operacionespublic double distancia(Punto p);public double modulo();public double anguloZeta();...};2.12.1.mplementacin del TAD Con]untoLa implementacin de un TAD se realiza segn la especificacin realizada del tipo. La claseConjuntoimplementaelTADConjunto,cuyaespecificacinseencuentraenelapartado2.3.Laclaserepresentalosdatosdeformagenrica,utilizaunarrayparaalmacenarloselementos,detipoObject.archivo conjunto.javapackage conjunto;public class Conjunto{static int M = 20; // aumento de la capacidadprivate Object [] cto;private int cardinal;private int capacidad;// operacionespublic Conjunto(){cto = new Object[M];cardinal = 0;capacidad = M;}// determina si el conjunto est vacopublic boolean esVacio(){return (cardinal == 0);}// aade un elemento si no est en el conjuntopublic 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();//devuelvelamemorianoreferenciada54 Estructuras de datos en Java}cto[cardinal++] = elemento;}}// quita elemento del conjuntopublic 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 conjuntopublic 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 elementospublic int cardinal(){return this.cardinal;}//operacin unin de dos conjuntospublic Conjunto union(Conjunto c2){Conjunto u = new Conjunto();// primero copia el primer operando de la uninfor (int k = 0; k < cardinal; k++)u.cto[k] = cto[k];u.cardinal = cardinal;// aade los elementos de c2 no incluidosfor (int k = 0; k < c2.cardinal; k++)u.annadir(c2.cto[k]);return u;}public Object elemento(int n) throws Exception{if (n