Anda di halaman 1dari 37

23

capitulo 2
Tipos de datos: Clases y ob]etos
Ob]etivos
Con 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.
Contenido
2.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.
RESUMEN
EJERCICIOS
PROBLEMAS
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.
24 Estructuras de datos en Java
NTRODUCCON
Enestecaptuloseexaminanlosconceptosdemodularidadyabstraccindedatos.Lamodula-
ridadeslaposibilidaddedividirunaaplicacinenpiezasmspequeasllamadasmdulos.La
abstraccindedatoseslatcnicaparainventarnuevostiposdedatosqueseanmsadecuadosa
unaaplicaciny,porconsiguiente,facilitenlaescrituradelprograma.Latcnicadeabstraccin
dedatosesunatcnicapotentedepropsitogeneralque,cuandoseutilizaadecuadamente,puede
producirprogramasmscortos,mslegiblesyflexibles.
Loslenguajesdeprogramacinsoportanensuscompiladorestiposdedatosfundamentaleso
bsicos(predefinidos),talescomoint,charyfloatenJava,CyC++.Lenguajesdeprogra-
macincomoJavatienencaractersticasquepermitenampliarellenguajeaadiendosuspropios
tiposdedatos.
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 programador
abstraealgunosconceptosdeprogramacincreandounnuevotipodedato.
Lamodularizacindeunprogramautilizalanocindetipoabstractodedato(TAD)siempre
queseaposible.Siellenguajedeprogramacinsoportalostiposquedeseaelusuarioyelconjun-
todeoperacionessobrecadatipo,seobtieneunnuevotipodedatodenominadoTAD.
Unaclaseesuntipodedatoquecontienecdigo(mtodos)ydatos.Unaclasepermiteen-
capsulartodoelcdigoylosdatosnecesariosparagestionaruntipoespecficodeunelemento
deprograma,comounaventanaenlapantalla,undispositivoconectadoaunacomputadora,una
figuradeunprogramadedibujoounatarearealizadaporunacomputadora.Enestecaptulose
aprenderacrear(definiryespecificar)yautilizarclasesindividuales.
2.1. AB8TRACCON EN LENGUAJE8 DE PROGRAMACON
Los lenguajes de programacin son las herramientas mediante las cuales los diseadores de
lenguajespuedenimplementarlosmodelosabstractos.Laabstraccinofrecidaporloslenguajes
deprogramacinsepuededividirendoscategoras:abstraccindedatos(pertenecientealos
datos)yabstraccindecontrol(pertenecientealasestructurasdecontrol).
Desdecomienzosdeladcadadelossesenta,cuandosedesarrollaronlosprimeroslenguajes
deprogramacindealtonivel,hasidoposibleutilizarlasabstraccionesmsprimitivasdeambas
categoras(variables,tiposdedatos,procedimientos,controldebucles,etc.).
2.1.1. Abstracciones de control
Los microprocesadores ofrecen directamente slo dos mecanismos para controlar el flujo y
ejecucin de las instrucciones: secuencia y salto. Los primeros lenguajes de programacin
dealtonivelintrodujeronlasestructurasdecontrol:sentenciasdebifurcacin(if)ybucles
(for, while, do-loop, etc.).
Lasestructurasdecontroldescribenelordenenelqueseejecutanlassentenciasogruposde
sentencia(unidadesdeprograma).Lasunidadesdeprogramaseutilizancomobloquesbsicos
delaclsicadescomposicindescendente.Entodosloscasos,lossubprogramasconstituyen
una herramienta potente de abstraccin ya que, durante su implementacin, el programador
describeendetallecmofuncionan.Cuandoelsubprogramasellama,bastaconconocerloque
haceynocmolohace.Deestemodo,seconviertenencajasnegrasqueamplanellenguaje
deprogramacinautilizar.Engeneral,lossubprogramassonlosmecanismosmsampliamente
utilizadosparareutilizarcdigo,atravsdecoleccionesdesubprogramasenbibliotecas.
Tipos de datos: Clases y objetos 25
Lasabstraccionesylasestructurasdecontrolseclasificanenestructurasdecontrolanivelde
sentenciayaniveldeunidades.Lasabstraccionesdecontrolaniveldeunidadseconocencomo
abstraccionesprocedimentales.
abstraccin procedimental (por procedimientos)
Es esencial para disear software modular y fiable la abstraccin procedimental que se basa
enlautilizacindeprocedimientosofuncionessinpreocuparsedecmoseimplementan.Esto
es posible slo si conocemos qu hace el procedimiento; esto es, conocemos la sintaxis y la
semnticaqueutilizaelprocedimientoofuncin.Laabstraccinapareceenlossubprogramas
debidoalassiguientescausas:
Conelnombredelossubprogramas,unprogramadorpuedeasignarunadescripcinabs-
tractaquecapturaelsignificadoglobaldelsubprograma.Utilizandoelnombreenlugarde
escribirelcdigo,permitealprogramadoraplicarlaaccinentrminosdesudescripcin
dealtonivelenlugardesusdetallesdebajonivel.
Los subprogramas proporcionan ocultacin de la informacin. Las variables locales y
cualquier otra definicin local se encapsulan en el subprograma, ocultndose de forma
que no pueden utilizarse fuera del subprograma. Por consiguiente, el programador no
tienequepreocuparsesobrelasdefinicioneslocales.
Losparmetrosdelossubprogramas,juntoconlaocultacindelainformacinanterior,
permitencrearsubprogramasqueconstituyenentidadesdesoftwarepropias.Losdetalles
localesdelaimplementacinpuedenestarocultos,mientrasquelosparmetrossepueden
utilizarparaestablecerlainterfazpblica.
EnJava,laabstraccinprocedimentalseestablececonlosmtodosofuncionesmiembros
declases.
otros mecanismos de abstraccin de control
La evolucin de los lenguajes de programacin ha permitido la aparicin de otros mecanismos
paralaabstraccindecontrol,comomanejodeexcepciones,corrutinas,unidadesconcurrentes
oplantillas(templates).Estasconstruccionessonsoportadasporloslenguajesdeprogramacin
basadosyorientadosaobjetos,comoJava,Modula-2,Ada,C++,SmalltalkoEiffel.
2.1.2. Abstracciones de datos
LosprimerospasoshacialaabstraccindedatossecrearonconlenguajestalescomoFORTRAN,
COBOL y ALGOL 60, con la introduccin de tipos de variables diferentes, que manipulaban
enteros, nmeros reales, caracteres, valores lgicos, etc. Sin embargo, estos tipos de datos no
podansermodificadosynosiempreseajustabanaltipodeunoparaelquesenecesitaban.Por
ejemplo,eltratamientodecadenasesunadeficienciaenFORTRAN,mientrasquelaprecisiny
fiabilidadparaclculosmatemticosesmuyalta.
Lasiguientegeneracindelenguajes,incluyendoPascal,SIMULA-67yALGOL68,ofre-
ciunaampliaseleccindetiposdedatosypermitialprogramadormodificaryampliarlos
tiposdedatosexistentesmedianteconstruccionesespecficas(porejemplo,arraysyregistros).
Adems,SIMULA-67fueelprimerlenguajequemezcldatosyprocedimientosmediantela
construccindeclases,queeventualmenteseconvirtienlabasedeldesarrollodeprograma-
cinorientadaaobjetos.
26 Estructuras de datos en Java
Laabstraccindedatoseslatcnicadeprogramacinquepermiteinventarodefinirnuevos
tiposdedatos(tiposdedatosdefinidosporelusuario)adecuadosalaaplicacinquesedesea
realizar.Laabstraccindedatosesunatcnicamuypotentequepermitedisearprogramasms
cortos,legiblesyflexibles.Laesenciadelaabstraccinessimilaralautilizacindeuntipode
dato,cuyousoserealizasintenerencuentacmoestrepresentadooimplementado.
Lostiposdedatossonabstraccionesyelprocesodeconstruirnuevostipossellamaabstrac-
cindedatos.Losnuevostiposdedatosdefinidosporelusuariosellamantiposabstractosde
datos.
El concepto de tipo, tal como se defini en Pascal y ALGOL 68, ha constituido un hito
importante para la realizacin de un lenguaje capaz de soportar programacin estructurada.
Sin embargo, estos lenguajes no soportan totalmente una metodologa orientada a objetos. La
abstraccindedatostilparaestepropsitonosloclasificaobjetosdeacuerdoasuestructura
derepresentacin,sinoquelosclasificandeacuerdoalcomportamientoesperado.Talcompor-
tamientoesexpresableentrminosdeoperacionesquesonsignificativassobreesosdatos,ylas
operacionessonelnicomedioparacrear,modificaryaccederalosobjetos.
En trminos ms precisos, Ghezzi indica que un tipo de dato definible por el usuario se
denominatipoabstractodedato(TAD)si:
Existeunaconstruccindellenguajequelepermiteasociarlarepresentacindelosdatos
conlasoperacionesquelomanipulan;
Larepresentacindelnuevotipodedatoestocultadelasunidadesdeprogramaquelo
utilizan[GHEzzI87].
Las clases de Java o de C++ cumplen las dos condiciones: agrupan los datos junto a las
operaciones,ysurepresentacinquedaocultadeotrasclases.
Lostiposabstractosdedatosproporcionanunmecanismoadicionalmedianteelcualsereali-
zaunaseparacinclaraentrelainterfazylaimplementacindeltipodedato.Laimplementacin
deuntipoabstractodedatoconstade:
1. Larepresentacin:eleccindelasestructurasdedatos.
2. Lasoperaciones:eleccindelosalgoritmos.
Lainterfazdeltipoabstractodedatoseasociaconlasoperacionesydatosvisiblesalexterior
delTAD.
2.2. TPO8 AB8TRACTO8 DE DATO8
Algunoslenguajesdeprogramacintienencaractersticasquenospermitenampliarellenguaje
aadiendosuspropiostiposdedatos.Untipodedatodefinidoporelprogramadorsedenomina
tipoabstractodedatos(TAD)paradiferenciarlodeltipofundamental(predefinido)dedatos.Por
ejemplo,enJava,eltipoPunto,querepresentalascoordenadasxeydeunsistemadecoorde-
nadas rectangulares, no existe. Sin embargo, es posible implementar el tipo abstracto de datos,
considerandolosvaloresquesealmacenanenlasvariablesyquoperacionesestndisponibles
paramanipularestasvariables.Enesencia,untipoabstractoesuntipodedatoqueconstadedatos
(estructurasdedatospropias)yoperacionesquesepuedenrealizarsobreellos.UnTADsecom-
ponedeestructurasdedatosylosprocedimientosofuncionesquemanipulanesasestructuras
dedatos.
Tipos de datos: Clases y objetos 27
Para recordar
Un tipo abstracto de datos puede defnirse mediante la ecuacin:
taD = Representacin (datos) + Operaciones (funciones y procedimientos)
Laestructuradeuntipoabstractodedato(clase),desdeunpuntodevistaglobal,secompone
delainterfazydelaimplementacin(Figura2.1).
Lasestructurasdedatosrealeselegidasparaalmacenarlarepresentacindeuntipoabstracto
dedatossoninvisiblesalosusuariosoclientes.Losalgoritmosutilizadosparaimplementarcada
unadelasoperacionesdelosTADestnencapsuladasdentrodelospropiosTAD.Lacaracters-
ticadeocultamientodelainformacinsignificaquelosobjetostieneninterfacespblicas.Sin
embargo,lasrepresentacioneseimplementacionesdeesasinterfacessonprivadas.
Figura 2.1 Estructura de un tipo abstracto de datos (TAD)
2.2.1. Venta]as de los tipos abstractos de datos
Untipoabstractodedatosesunmodelo(estructura)conunnmerodeoperacionesqueafectan
aesemodelo.Lostiposabstractosdedatosproporcionannumerososbeneficiosalprogramador,
quesepuedenresumirenlossiguientes:
1. Permiten una mejor conceptualizacin y modelizacin del mundo real. Mejoran la
representacinylacomprensibilidad.Clarificanlosobjetosbasadosenestructurasy
comportamientoscomunes.
28 Estructuras de datos en Java
2. Mejoranlarobustezdelsistema.Sihaycaractersticassubyacentesenloslenguajes,per-
mitenlaespecificacindeltipodecadavariable.Lostiposabstractosdedatospermiten
lacomprobacindetiposparaevitarerroresdetipoentiempodeejecucin.
3. Mejoranelrendimiento(prestaciones).Parasistemastipeados(tipificados),elconoci-
mientodelosobjetospermitelaoptimizacindetiempodecompilacin.
4. Separanlaimplementacindelaespecificacin.Permitenlamodificacinylamejorade
laimplementacinsinafectarlainterfazpblicadeltipoabstractodedato.
5. Permiten la extensibilidad del sistema. Los componentes de software reutilizables son
msfcilesdecrearymantener.
6. Recogenmejorlasemnticadeltipo.Lostiposabstractosdedatosagrupanolocalizanlas
operacionesylarepresentacindeatributos.
UnprogramaquemanejaunTADlohaceteniendoencuentalasoperacionesolafunciona-
lidadquetiene,sininteresarseporlarepresentacinfsicadelosdatos.Esdecir,losusuariosde
unTADsecomunicanconsteapartirdelainterfazqueofreceelTADmediantefuncionesde
acceso.Podracambiarselaimplementacindeltipodedatosinafectaralprogramaqueusael
TADyaqueparaelprogramaestoculta.
2.2.2. mplementacin de los TAD
LasunidadesdeprogramacindelenguajesquepuedenimplementarunTADrecibendistintos
nombres:
Modula-2 mdulo
Ada paquete
C++ clase
Java clase
EnestoslenguajessedefinenlaespecificacindelTAD,quedeclaralasoperacionesylos
datos, y la implementacin, que muestra el cdigo fuente de las operaciones, que permanece
ocultoalexteriordelmdulo.
2.3. E8PECFCACON DE LO8 TAD
ElobjetivodelaespecificacinesdescribirelcomportamientodelTAD;constadedospartes,
la descripcin matemtica del conjunto de datos y la de las operaciones definidas en ciertos
elementosdeeseconjuntodedatos.
LaespecificacindelTADpuedetenerunenfoqueinformal,quedescribelosdatosylas
operaciones relacionadas en lenguaje natural. Otro enfoque mas riguroso, la especificacin
formal, supone suministrar un conjunto de axiomas que describen las operaciones en su as-
pectosintcticoysemntico.
2.3.1. Especificacin informal de un TAD
Constadedospartes:
Detallarenlosdatosdeltipolosvaloresquepuedentomar.
Describirlasoperacionesrelacionndolasconlosdatos.
Tipos de datos: Clases y objetos 29
Elformatoquegeneralmenteseemplea,primeroespecificaelnombredelTADylosdatos:
TADnombredeltipo(valoresysudescripcin)
Acontinuacincadaunadelasoperacionesconsusargumentos,yunadescripcinfuncional
enlenguajenatural,conesteformato:
Operacin(argumentos)
Descripcin funcional
Comoejemplo,sevaaespecificareltipoabstractodedatosConjunto:
TADConjunto(coleccindeelementossinduplicidades,puedenestarencualquierorden,se
usapararepresentarlosconjuntosmatemticosconsusoperaciones).
Operaciones,seponenlasoperacionesbsicassobreconjuntos:
Conjuntovacio.
Creaunconjuntosinelementos.
Aadir(Conjunto,elemento).
Comprueba si el elemento forma parte del conjunto; en caso negativo, es aadido. La
operacinmodificaalconjunto.
Retirar(Conjunto,elemento).
Sielelementopertenecealconjunto,eseliminadodeste.Laoperacinmodificaalconjunto.
Pertenece(Conjunto,elemento).
Verificasielelementoformapartedelconjunto,encuyocasodevuelvecierto.
Esvacio(Conjunto).
Verificasielconjuntonotieneelementos,encuyocasodevuelvecierto.
Cardinal(Conjunto).
Devuelveelnmerodeelementosdelconjunto.
Union(Conjunto,Conjunto).
Realizalaoperacinmatemticadelaunindedosconjuntos.Laoperacindevuelveun
conjuntoconloselementoscomunesynocomunesalosdosconjuntos.
Sepuedenespecificarmsoperacionessobreconjuntos,tododependerdelaaplicacinque
sequieradaralTAD.
A tener en cuenta
La 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 TAD
Laespecificacinformalproporcionaunconjuntodeaxiomasquedescribenelcomportamiento
detodaslasoperaciones.Ladescripcinhadeincluirunapartedesintaxis,encuantoalostipos
30 Estructuras de datos en Java
delosargumentosyaltipodelresultado,yunapartedesemntica,dondesedetallalaexpresin
delresultadoqueseobtieneparaunosvaloresparticularesdelosargumentos.Laespecificacin
formalhadeserlobastantepotenteparaquecumplaelobjetivodeverificarlacorreccindela
implementacindelTAD.
ElesquemaquesigueconstadeunacabeceraconelnombredelTADylosdatos:
TAD nombre del tipo (valores que toma los datos del tipo)
Lesiguelasintaxisdelasoperaciones,quelistalasoperacionesmostrandolostiposdelos
argumentosyeltipodelresultado:
Sintaxis
Operacin(Tipo argumento, ...) -> Tipo resultado
A continuacin se explica la semntica de las operaciones. sta se construye dando unos
valoresparticularesalosargumentosdelasoperaciones,apartirdelosqueseobtieneunaex-
presin resultado. ste puede tener referencias a tipos ya definidos, valores de tipo lgico o
referenciasaotrasoperacionesdelpropioTAD.
Semntica
Operacin(valores particulares argumentos) expresin resultado
Alhacerunaespecificacinformal,siemprehayoperacionesdefinidasporsmismasquese
consideranconstructoresdelTAD.Sepuededecirquemedianteestosconstructoressegeneran
todoslosposiblesvaloresdelTAD.Normalmente,seeligecomoconstructorlaoperacinque
inicializa(porejemplo,ConjuntovacoenelTADConjunto)ylaoperacinqueaadeundatoo
elemento(estaoperacinescomnalamayoradelostiposabstractosdedatos).Seacostumbra
amarcarconunasteriscolasoperacionesquesonconstructores.
AcontinuacinseespecificaformalmenteelTADConjunto;paraformarlaexpresinresul-
tadosehaceuso,siesnecesario,delasentenciaalternativasi-entonces-sino.
TADConjunto(coleccindeelementossinduplicidades,puedenestarencualquierorden,se
usapararepresentarlosconjuntosmatemticosconsusoperaciones).
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 31
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)
2.4. CLA8E8 Y OBJETO8
Elparadigmaorientadoaobjetosnacien1969delamanodeldoctornoruegoKristinNygaard,
quealintentarescribirunprogramadecomputadoraquedescribieraelmovimientodelosbarcos
atravsdeunfiordo,descubriqueeramuydifcilsimularlasmareas,losmovimientosdelos
barcosylasformasdelalneadelacostaconlosmtodosdeprogramacinexistentesenese
momento.Descubriqueloselementosdelentornoquetratabademodelarbarcos,mareasy
lneadelacostadelosfiordosylasaccionesquecadaelementopodaejecutarmantenanunas
relacionesqueeranmsfcilesdemanejar.
Las tecnologas orientadas a objetos han evolucionado mucho, pero mantienen la razn de
serdelparadigma:combinacindeladescripcindeloselementosenunentornodeprocesode
datosconlasaccionesejecutadasporesoselementos.Lasclasesylosobjetos,comoinstanciaso
ejemplaresdeellas,sonloselementosclavesobrelosquesearticulalaorientacinaobjetos.
2.4.1. Ou son ob]etos?
Enelmundoreal,laspersonasidentificanlosobjetoscomocosasquepuedenserpercibidaspor
los cinco sentidos. Los objetos tienen propiedades especficas, como posicin, tamao, color,
forma,textura,etc.quedefinensuestado.Losobjetostambinposeenciertoscomportamientos
queloshacendiferentesdeotrosobjetos.
Booch
1
defineunobjetocomoalgoquetieneunestado,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 seal
deerrorocambiarlavelocidad.Suidentidadsebasaenelhechodequecadainstanciadeuna
mquinaesnica,talvezidentificadaporunnmerodeserie.Lascaractersticasqueseeligen
paraenfatizarelestadoyelcomportamientoseapoyarnencmounobjetomquinaseutilizar
enunaaplicacin.Enundiseodeunprogramaorientadoaobjetos,secreaunaabstraccin(un
modelosimplificado)delamquinabasadaenlaspropiedadesyenelcomportamientoqueson
tileseneltiempo.

1
Booch, Grady. Anlisis y diseo orientado a objetos con aplicaciones. Madrid: Daz de Santos/
Addison-Wesley,1995(librotraducidoalespaolporlosprofesoresCuevayJoyanes).
32 Estructuras de datos en Java
MartinyOdelldefinenunobjetocomocualquiercosa,realoabstracta,enlaquesealmace-
nandatosyaquellosmtodos(operaciones)quemanipulanlosdatos.Pararealizaresaactividad,
seaadenacadaobjetodelaclaselospropiosdatosasociadosconsuspropiosmtodosmiembro
quepertenecenalaclase.
Unmensajeesunainstruccinqueseenvaaunobjetoyque,cuandoserecibe,ejecutasus
acciones.Unmensajeincluyeunidentificadorquecontienelaaccinquehadeejecutarelobjeto
juntoconlosdatosquenecesitaelobjetopararealizarsutrabajo.Losmensajes,porconsiguiente,
formanunaventanadelobjetoalmundoexterior.
Elusuariodeunobjetosecomunicaconelobjetomediantesuinterfaz,unconjuntodeope-
raciones definidas por la clase del objeto de modo que sean todas visibles al programa. Una
interfazsepuedeconsiderarcomounavistasimplificadadeunobjeto.Porejemplo,undispositivo
electrnico como una mquina de fax tiene una interfaz de usuario bien definida; por ejemplo,
esainterfazincluyeelmecanismodeavancedelpapel,botonesdemarcado,elreceptoryelbotn
enviar.Elusuarionotienequeconocercmoestconstruidalamquinainternamente,elpro-
tocolodecomunicacionesuotrosdetalles.Dehecho,laaperturadelamquinaduranteelperiodo
degarantapuedeanularla.
2.4.2. Ou son clases?
Entrminosprcticos,unaclaseesuntipodefinidoporelusuario.Lasclasessonlosbloquesde
construccinfundamentalesdelosprogramasorientadosaobjetos.Boochdefineunaclasecomo
unconjuntodeobjetosquecompartenunaestructurayuncomportamientocomunes.
Unaclasecontienelaespecificacindelosdatosquedescribenunobjetojuntoconladescrip-
cindelasaccionesqueunobjetoconocecmohadeejecutar.Estasaccionesseconocencomo
servicios o mtodos. Una clase incluye tambin todos los datos necesarios para describir los
objetoscreadosapartirdelaclase.Estosdatosseconocencomoatributos,variablesovariables
instancia. El trmino atributo se utiliza en anlisis y diseo orientado a objetos, y el trmino
variableinstanciasesueleutilizarenprogramasorientadosaobjetos.
2.5. DECLARACON DE UNA CLA8E
Antes de que un programa pueda crear objetos de cualquier clase, sta debe ser definida. La
definicin de una clase significa que se debe dar a la misma un nombre, dar nombre tambin
a los elementos que almacenan sus datos y describir los mtodos que realizarn las acciones
consideradasenlosobjetos.
Las definiciones o especificaciones no son un cdigo de programa ejecutable. Se utilizan
paraasignaralmacenamientoalosvaloresdelosatributosusadosporelprogramayreconocer
losmtodosqueutilizarelprograma.Normalmente,sesitanenarchivosformandolosdeno-
minadospackages,seutilizaunarchivoparavariasclasesqueestnrelacionadas.
Formato
class NombreClase
{
lista_de_miembros
}
Tipos de datos: Clases y objetos 33
NombreClase Nombredefinidoporelusuarioqueidentificalaclase(puede
incluirletras,nmerosysubrayados).
lista _ de _ miembros mtodosydatosmiembrosdelaclase.
E]emplo 2.1
DefinicindeunaclasellamadaPuntoquecontienelascoordenadasxeydeunpuntoen
unplano.
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;
}
}
E]emplo 2.2
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(){...}
34 Estructuras de datos en Java
public int leerMadre(){...}
public int leerPadre(){...}
}
2.5.1. Ob]etos
Unavezqueunaclasehasidodefinida,unprogramapuedecontenerunainstanciadelaclase,
denominadaobjetodelaclase.Unobjetosecreaconeloperadornew aplicadoaunconstructor
delaclase.UnobjetodelaclasePuntoinicializadoalascoordenadas(2,1)sera:
new Punto(2,1);
Eloperadornewcreaelobjetoydevuelveunareferenciaalobjetocreado.Estareferenciase
asignaaunavariabledeltipodelaclase.Elobjetopermanecervivosiemprequeestreferen-
ciadoporunavariabledelaclasequeesinstancia.
Formato para definir una referencia
NombreClase varReferencia;
Formato para crear un objeto
varReferencia = new NombreClase(argmntos _ constructor);
Todaclasetieneunoomasmtodos,denominadosconstructores,parainicializarelobjeto
cuandoescreado;tienenelmismonombrequeeldelaclase,notienentipoderetornoypueden
estarsobrecargados.EnlaclaseEdaddelEjemplo2.2,elconstructor notieneargumentos, se
puedecrearunobjeto:
Edad f = new Edad();
Eloperadordeaccesoaunmiembro(.)seleccionaunmiembroindividualdeunobjetodela
clase.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 35
2.5.2. Visibilidad de los miembros de la clase
Unprincipiofundamentalenprogramacinorientadaaobjetoseslaocultacindelainfor-
macin,quesignificaqueadeterminadosdatosdelinteriordeunaclasenosepuedeacceder
por mtodos externos a ella. El mecanismo principal para ocultar datos es ponerlos en una
claseyhacerlosprivados.Alosdatosomtodosprivadosslosepuedeaccederdesdedentro
delaclase.Porelcontrario,losdatosomtodospblicossonaccesiblesdesdeelexteriorde
laclase.
Noaccesibles
desdeelexterior
delaclase
(accesodenegado)
Privado
Datoso
Mtodos
Accesible
desdeelexterior
delaclase
Pblico
Datoso
Mtodos
Figura 2.2 Secciones pblica y privada de una clase
Paracontrolarelaccesoalosmiembrosdelaclaseseutilizantresespecificadoresdeacceso:
public,privateyprotected.Cadamiembrodelaclaseestprecedidodelespecificadorde
accesoquelecorresponde.
Formato
class NombreClase
{
private declaracin miembro privado; // miembros privados
protected declaracin miembro protegido; // miembros protegidos
public declaracin miembro pblico; // miembros pblicos
}
Elespecificadorpublicdefinemiembrospblicos,quesonaquellosalosquesepuedeac-
cederporcualquiermtododesde fuera de laclase.Alosmiembrosque siguen al especificador
private slo se puede acceder por mtodos miembros de la misma clase.A los miembros que
siguenalespecificadorprotectedsepuedeaccederpormtodosmiembrodelamismaclaseo
declasesderivadas,ascomopormtodosdeotrasclasesqueseencuentranenelmismopaquete.
Losespecificadorespublic,protectedyprivatepuedenaparecerencualquierorden.Sinose
especificaacceso(accesopordefecto)aunmiembrodeunaclase,astesepuedeaccederdesdelos
mtodosdelaclaseydesdecualquiermtododelasclasesdelpaqueteenelqueseencuentra.
E]emplo 2.3
DeclaracindelaclaseFotoyMarcoconmiembrosdeclaradoscondistintavisibilidad.Ambas
clasesformanpartedelpaquetesoporte.
36 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 2.1 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 x
En blanco x x
Protected x x x
Public
x x x x
Aunquelasespecificacionespblicas,privadasyprotegidaspuedenaparecerencualquier
orden,enJavalosprogramadoressuelenseguirciertasreglaseneldiseoquecitamosaconti-
nuacin,paraqueustedpuedaelegirlaqueconsideremseficiente.
1. Ponerlosmiembrosprivadosprimero,debidoaquecontienenlosatributos(datos).
2. Colocarlosmiembrospblicosprimero,debidoaquelosmtodosylosconstructoresson
lainterfazdelusuariodelaclase.
En realidad, tal vez el uso ms importante de los especificadores de acceso es implementar
la ocultacin de la informacin. El principio de ocultacin de la informacin indica que toda
la interaccin con un objeto se debe restringir a utilizar una interfaz bien definida que permita
ignorarlosdetallesdeimplementacindelosobjetos.Porconsiguiente,losdatosylosmtodos
Tipos de datos: Clases y objetos 37
pblicosformanlainterfazexternadelobjeto,mientrasqueloselementosprivadossonlosas-
pectos internos que nonecesitanser accesiblespara usar elobjeto.Loselementosdeuna clase
sinespecificadorylosprotectedtienenlasmismaspropiedadesquelospblicosrespectoalas
clasesdelpaquete.
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 clase
LasmtodosenJavasiempresonmiembrosdeclases,nohaymtodosofuncionesfueradelas
clases.Laimplementacindelosmtodosseincluyedentrodelcuerpodelaclase.LaFigura2.3
muestraladeclaracincompletadeunaclase.
? Encapsulacin.
Figura 2.3 Definicin tpica de una clase
E]emplo 2.4
LaclaseRacionaldefineelnumeradoryeldenominadorcaractersticosdeunnmeroracional.
Porcadadatoseproporcionaunmtodomiembroquedevuelvesuvaloryunmtodoqueasigna
numeradorydenominador.Tieneunconstructorqueinicializaunobjetoa0/1.
class Racional
{
private int numerador;
private int denominador;
public Racional()
{
numerador = 0;
denominador = 1;
}
38 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;
}
}
E]ercicio 2.1
Definir una clase DiaAnyo que contenga los atributos mes y da, el mtodo igual() y el
mtodovisualizar().Elmesseregistracomounvalorentero(1,Enero;2,Febrero;etc.).El
dadelmesseregistraenlavariableenterada.Escribirunprogramaquecompruebesiuna
fechaesladesucumpleaos.
Elmtodomain()delaclaseprincipal,Cumple,creaunobjetoDiaAnyoyllamaalmtodo
igual()paradeterminarsicoincidelafechadelobjetoconlafechadesucumpleaos,queseha
ledodeldispositivodeentrada.
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 main
public 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 39
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 ! ");
}
}
2.5.4. mplementacin de las clases
Elcdigofuentedeladefinicindeunaclase,contodossusmtodosyvariablesinstanciaseal-
macenaenarchivosdetextoconextensin.javayelnombredelaclase,porejemplo,Racional.
java.Normalmente,sesitalaimplementacindecadaclaseenunarchivoindependiente.
Lasclasespuedenprocederdediferentesfuentes:
Se pueden declarar e implementar sus propias clases. El cdigo fuente siempre estar
disponible;puedenestarorganizadasporpaquetes.
Sepuedenutilizarclasesquehayansidoescritasporotraspersonasoinclusoquesehayan
comprado.Enestecaso,sepuededisponerdelcdigofuenteoestarlimitadoautilizarel
bytecodedelaimplementacin.Sernecesariodisponerdelpaquetedondeseencuentran.
Se pueden utilizar clases de los diversos packages que acompaan a su software de
desarrolloJava.
2.5.5. Clases pblicas
Ladeclaracindeunaclasepuedeincluirelmodificadorpubliccomoprefijoenlacabecerade
laclase.Porejemplo:
public class Examen
{
// miembros de la clase
}
LaclaseExamenpuedeserutilizadaporlasclasesqueseencuentranensumismoarchivo
(package),oporclasesdecualquierotropaqueteoarchivo.Habitualmente,lasclasessedefinen
40 Estructuras de datos en Java
comopublic,anoserquesequierarestringirsuusoalasclasesdelpaquete.Unaclasedecla-
radasinelprefijopublicestableceunarestriccinimportante,yesqueslopodrserutilizada
porlasclasesdefinidasenelmismopaquete.
Advertencia
El especificador de acceso public es el nico que se puede especificar en la cabecera
de una clase.
2.6. PAOUETE8
LospaquetessonlaformaquetieneJavadeorganizarlosarchivosconlasclasesnecesariaspara
construirlasaplicaciones.Javaincorporavariospaquetes,porejemplojava.lang ojava.io,
conlasclasesbsicasparaconstruirprogramas:System, String, Integer ...
2.6.1. 8entencia package
Cmo se puede definir un paquete? La sentencia package se utiliza para este cometido. En
primerlugarsedebeincluirlasentenciapackagecomoprimeralneadelarchivofuentedecada
una de las clases del paquete. Por ejemplo, si las clases Lapiz, Boligrafo y Folio se van a
organizarformandoelpaqueteescritorio,elesquemaaseguireselsiguiente:
// archivo fuente Lapiz.java
package escritorio;
public class Lapiz
{
// miembros de clase Lapiz
}
// archivo fuente Boligrafo.java
package escritorio;
public class Boligrafo
{
// miembros de clase Boligrafo
}
// archivo fuente Folio.java
package escritorio;
public class Folio
{
// miembros de clase Folio
}
Tipos de datos: Clases y objetos 41
Formato
package NombrePaquete;
Ensegundolugar,unavezcreadoelarchivofuentedecadaclasedelpaquete,sedebenubicar
cadaunoenunsubdirectorioconelmismonombrequeeldelpaquete.Enelesquemaanteriorse
ubicarnlosarchivosLapiz.java,Boligrafo.javayFolio.javaenelcaminoescritorio.
Elusodepaquetestienedosbeneficiosimportantes:
1. Lasrestriccionesdevisibilidadsonmenoresentreclasesqueestndentrodelmismopaquete.
Desdecualquierclasedeunpaquete,losmiembrosprotectedylosmiembrossinmodifi-
cadordevisibilidadsonaccesibles,peronolosondesdeclasesdeotrospaquetes.
2. Laseleccindelasclasesdeunpaquetesepuedeabreviarconlasentenciaimportdelpaquete.
2.6.2. mport
Lasclasesqueseencuentranenlospaquetesseidentificanutilizandoelnombredelpaquete,el
selectorpunto(.)y,acontinuacin,elnombredelaclase.Porejemplo,ladeclaracindelaclase
ArteconatributosdelaclasePrintStream(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,acontinuacindela
sentenciapackage.Tienedosformatos:
Formato
import identificadorpaquete.nombreClase;
import identificadorpaquete.*;
Elprimerformatoespecificaunaclaseconcreta.Elsegundoformatoindicaqueparatodaslas
clasesdeunpaquetenohacefaltacualificarelnombredelaclaseconelnombredelpaquete.
42 Estructuras de datos en Java
Confrecuenciaseutilizaelformato.*.Tienelaventajadepodersimplificarcualquierclase
delpaquete,perosepuedensealarlossiguientesproblemas:
Se desconoce qu clases concretas del paquete se estn utilizando. Por contra, con una
sentenciaimportporcadaclaseutilizadaseconocenlasclasesempleadas.
Puede haber colisiones entre nombres de clases declaradas en el archivo y nombres de
clasesdelpaquete.
Mayortiempodecompilacin,debidoaqueelcompiladorbuscalaexistenciadecualquier
claseenelpaquete.
Nota
Aunque aparezca la sentencia import paquete.*, el compilador genera bytecode slo
para las clases utilizadas.
E]emplo 2.5
SecreaelpaquetenumericoconlaclaseRandomyseutilizalaclaseenunaaplicacin.
package numerico;
public Random
{
// ...
}
Alutilizarlaclaseenotroarchivo:
import java.util.*
import numerico.*;
Enelpaquetejava.utilseencuentralaclaseRandom,porelloseproduceunaambigedad
conlaclaseRandomdelpaquetenumerico.Esnecesariocualificarcompletamenteelnombre
delaclaseRandomde,porejemplo,java.util.
java.util.Random aleatorio; // define una referencia
2.7. CON8TRUCTORE8
Unconstructoresunmtodoqueseejecutaautomticamentecuandosecreaunobjetodeuna
clase.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 43
E]emplo 2.6
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);
SehacreadounainstanciadeRectangulopasandovaloresconcretosalconstructordela
clase,ydeestaformaquedainicializado.
2.7.1. Constructor por defecto
Un constructor que no tiene parmetros se llama constructor por defecto. Un constructor por
defectonormalmenteinicializalosmiembrosdatodelaclaseconvalorespordefecto.
Regla
Java 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.
E]emplo 2.7
Elconstructorpordefectoinicializaxeya0.
public class Punto
{
private int x;
private int y;
public Punto() // constructor por defecto
{
x = 0;
44 Estructuras de datos en Java
y = 0;
}
}
CuandosecreaunobjetoPunto,susmiembrosdatoseinicializana0.
Punto P1 = new Punto() ; // P1.x == 0, P1.y == 0
Precaucin
Tenga 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 sobrecargados
Al igual que se puede sobrecargar un mtodo de una clase, tambin se puede sobrecargar el
constructordeunaclase.Dehecho,losconstructoressobrecargadossonbastantefrecuentesy
proporcionandiferentesalternativasparainicializarobjetos.
Regla
Para 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.8
Laclase EquipoSonido sedefinecontresconstructores:unopordefecto,otroconunargumento
detipocadenayeltercerocontresargumentos.
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 45
potencia = p;
voltios = v;
numCd = 20;
System.out.println("Constructor con tres argumentos ");
}
public double factura(){...}
};
LainstanciacindeunobjetoEquipoSonidopuedehacersellamandoacualquierconstructor:
EquipoSonido rt, gt, ht; // define tres referencias
rt = new EquipoSonido(); // llamada al constructor por defecto
gt = new EquipoSonido("JULAT");
rt = new EquipoSonido("PARTOLA",35,220);
2.8. RECOLECCON DE OBJETO8
EnJava,unobjetosiemprehadeestarreferenciadoporunavariable;enelmomentoenqueun
objetodejadeestarreferenciado,seactivalarutinaderecoleccindememoria,sepuededecir
queelobjetoesliberadoylamemoriaqueocupapuedeserreutilizada.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 objetos
quenoestnreferenciadosporningunavariable.ElprocesolorealizaelmtodoSystem.gc
(garbagecollection).Porejemplo,elsiguientemtodocreaobjetosContadorqueseliberan
alperdersureferencia.
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
46 Estructuras de datos en Java
2.8.1. Mtodo finalize()
El mtodo finalize() es especial, se llama automticamente si ha sido definido en la clase,
justoantesquelamemoriadelobjetorecolectadovayaaserdevueltaalsistema.Elmtodono
esundestructordelobjeto,noliberamemoria;enalgunasaplicaciones,sepuedeutilizarpara
liberarciertosrecursosdelsistema.
REGLA
finalize() 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.2
Sedeclarandosclases,cadaunaconsumtodofinalize().Elmtodomain()creaobjetos
deambasclases;lasvariablesquereferencianalosobjetossemodificanparaquecuandose
activelarecoleccinautomticadeobjetosseliberelamemoriadeestos;hayunallamadaa
System.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 47
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
}
2.9. OBJETO OUE ENVA EL MEN8AJE: this
thisesunareferenciaalobjetoqueenvaunmensaje,osimplemente,unareferenciaalobjeto
quellamaunmtodo(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.Aparentemente
nodistingueentreunobjetouotro,perocadavariableinstanciaimplcitamenteestcualificada
porthis.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.
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 CLA8E
Cadainstanciadeunaclase,cadaobjeto,tienesupropiacopiadelasvariablesdelaclase.Cuando
interesequehayamiembrosquenoestnligadosalosobjetossinoalaclasey,portanto,sean
comunesatodoslosobjetos,estossedeclaranstatic.
2.10.1. Variables static
Las variables de clase static son compartidas por todos los objetos de la clase. Se declaran
de igual manera que otra variable, aadiendo como prefijo la palabra reservada static. Por
ejemplo:
public class Conjunto
{
private static int k = 0;
static Totem lista = null;
// ...
}
Tipos de datos: Clases y objetos 49
Lasvariablesmiembrostaticnoformanpartedelosobjetosdelaclasesinodelapropiacla-
se.Dentrodelasclase,seaccedeaellasdelamanerahabitual,simplementeconsunombre.Desde
fueradelaclase,seaccedeconelnombredelaclase,elselectoryelnombredelavariable:
Conjunto.lista = ... ;
Tambinsepuedeaccederatravsdeunobjetodelaclaseperonoesrecomendable,yaque
losmiembrosstaticnopertenecenalosobjetossinoalasclases.
E]ercicio 2.3
Dadaunaclase,sequiereconocerentodomomentolosobjetosactivosenlaaplicacin.
SedeclaralaclaseEjemploconunconstructorpordefectoyotroconunargumento.Ambos
incrementanlavariablestatic cuentaen1.Deesamanera,cadanuevoobjetoquedacon-
tabilizado.Tambin se declara el mtodo finalize(), de tal forma que al activarse cuenta
decreceen1.
Elmtodomain()creaobjetosdelaclaseEjemployvisualizalavariablequecontabiliza
elnmerodesusobjetos.
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);
50 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,existe
una construccin de Java que permite inicializar miembros static en un bloque de cdigo
dentrodelaclase;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 static
Losmtodosdelasclasessellamanatravsdelosobjetos.Enocasionesinteresadefinirmtodos
queestncontroladosporlaclase,demodoquenohagafaltacrearunobjetoparallamarlos:son
losmtodosstatic.MuchosmtodosdelabibliotecaJavaestndefinidoscomostatic;es,por
ejemplo,elcasodelosmtodosmatemticosdelaclaseMath:Math.sin(), Math.sqrt().
Lallamadaalosmtodosstaticserealizaatravsdelaclase:NombreClase.metodo(),
respetandolasreglasdevisibilidad.Tambinsepuedenllamarconunobjetodelaclase;perono
esrecomendabledebidoaquesonmtodosdependientesdelaclaseynodelosobjetos.
Losmtodosdefinidoscomostaticnotienenasignadalareferenciathis,porloqueslo
puedenaccederamiembrosstaticdelaclase.Esunerrorqueunmtodo staticaccedaa
miembrosdelaclasenostatic.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 51
al compilar da dos errores debido a que desde el mtodo main(), definido como static, se
accedeamiembrosnostatic.
E]emplo 2.9
Laclase SumaSeriedefinetresvariablesstatic,yunmtodostaticquecalculalasuma
cadavezquesellama.
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 Object
ObjecteslasuperclasebasedetodaslasclasesdeJava;todaclasedefinidaenJavaheredadela
claseObjecty,enconsecuencia,todavariablereferenciaaunaclaseseconvierte,automtica-
mente,altipoObject.Porejemplo:
Object g;
String cd = new String("Barranco la Parra");
Integer y = new Integer(72); // objeto inicializado a 72
g = cd; // g referencia al mismo objeto que cd
g = y; // g ahora referencia a un objeto Integer
LaclaseObjecttienedosmtodosimportantes:equals()ytoString().Generalmente,se
redefinenenlasclasesparaespecializarlos.
equals()
Comparaelobjetoquehacelallamadaconelobjetoquesepasacomoargumento,devuelvetrue
sisoniguales.
boolean equals(Object k);
El siguiente ejemplo compara dos objetos; la comparacin es true si contienen la misma
cadena.
String ar = new String("Iglesia romnica");
52 Estructuras de datos en Java
String a = "Vida sana";
if (ar.equals(a)) //...no se cumple, devuelve false
toString()
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 una
variable.
Double r = new Double(2.5);
String rp;
rp = r.toString();
2.11.1. Operador instanceof
Confrecuencia,senecesitaconocerlaclasedelaqueesinstanciaunobjeto.Hayqueteneren
cuentaque,enlasjerarquasdeclases,sedanconversionesautomticasentreclasesderivadas
ysuclasebase;enparticular,cualquierreferenciasepuedeconvertiraunavariabledetipo
Object.
Coneloperadorinstanceofsedeterminalaclasealaqueperteneceunobjeto,quetiene
dosoperandos:elprimeroesunobjetoy,elsegundo,unaclase.Evalalaexpresinatruesiel
primeroesunainstanciadelsegundo.LasiguientefuncintieneunaargumentodetipoObject,
porloquepuederecibircualquierreferencia,seleccionandolaclasealaqueperteneceelobjeto
transmitido(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 JAVA
LaimplementacindeunTADenJavaserealizadeformanaturalconunaclase.Dentrodelaclase
vaaresidirlarepresentacindelosdatosjuntoalasoperaciones(mtodosdelaclase).Lainterfaz
deltipoabstractoquedaperfectamentedeterminadaconlaetiquetapublic,queseaplicaralos
mtodosdelaclasequerepresentenoperaciones.
Porejemplo,sisehaespecificadoelTADPuntopararepresentarlaabstraccinpuntoenel
espaciotridimensional,lasiguienteclaseimplementaeltipo:
class Punto
{
Tipos de datos: Clases y objetos 53
// representacin de los datos
private double x, y, z;
// operaciones
public double distancia(Punto p);
public double modulo();
public double anguloZeta();
...
};
2.12.1. mplementacin del TAD Con]unto
La implementacin de un TAD se realiza segn la especificacin realizada del tipo. La clase
ConjuntoimplementaelTADConjunto,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
54 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 <= cardinal)
return cto[--n];
else
throw new Exception("Fuera de rango");
}
}
Tipos de datos: Clases y objetos 55
RESuMEN
Lostiposabstractosdedatos(TAD)describenunconjuntodeobjetosconlamismarepresen-
tacinycomportamiento.Lostiposabstractosdedatospresentanunaseparacinclaraentre
la interfazexternade un tipo de datos y su implementacininterna. La implementacinde
untipoabstractodedatosestoculta.Porconsiguiente,sepuedenutilizarimplementaciones
alternativasparaelmismotipoabstractodedatosincambiarsuinterfaz.
La especificacin de un tipo abstracto de datos se puede hacer de manera informal, o bien,
deformamasrigurosa,unaespecificacinformal.Enlaespecificacininformalsedescriben
literalmentelosdatosylafuncionalidaddelasoperaciones.Laespecificacinformaldescribe
losdatos,lasintaxisylasemnticadelasoperaciones,considerandociertasoperacionescomo
axiomas,quesonlosconstructoresdenuevosdatos.Unabuenaespecificacinformaldeun
tipoabstractodedatosdebepoderverificarlabondaddelaimplementacin.
Enlamayoradeloslenguajesdeprogramacinorientadosaobjetos,yenparticularenJava,
lostiposabstractosdedatosseimplementanmedianteclases.
Unaclaseesuntipodedatodefinidoporelprogramadorquesirvepararepresentarobjetos
del mundo real. Un objeto de una clase tiene dos componentes: un conjunto de atributos
o variables instancia y un conjunto de comportamientos (mtodos). Los atributos tambin
sellamanvariablesinstanciaomiembrosdato,yloscomportamientossellaman mtodos
miembro.
class Circulo
{
private double centroX;
private double centroY;
private double radio;
public double superfcie(){}
}
Unobjetoesunainstanciadeunaclase,yunavariablecuyotiposealaclaseesunareferencia
aunobjetodelaclase.
Circulo unCirculo; // variable del tipo clase
Circulo [] tipocirculo = new Circulo[10]; // array de referencias
La definicin de una clase, en cuanto a visibilidad de sus miembros, tiene tres secciones:
pblica,privada yprotegida.La seccin pblicacontiene declaraciones delosatributos y
delcomportamientodelobjetoquesonaccesiblesalosusuariosdelobjeto.Serecomiendala
declaracindelosconstructoresenlaseccinpblica.Laseccinprivadacontienelosm-
todosmiembroylosmiembrosdato,quesonocultosoinaccesiblesalosusuariosdelobjeto.
Estosmtodosmiembroyatributosdatosonaccesiblessloporlosmtodosmiembrodel
objeto.Losmiembrosdeunaclaseconvisibilidad protected sonaccesiblesparacualquier
usuariodelaclasequeseencuentreenelmismo package; tambinsonaccesiblesparalas
clasesderivadas.Elaccesopordefecto,sinmodificador,tienelasmismaspropiedadesqueel
acceso protected paralasclasesqueseencuentranenelmismo package.
56 Estructuras de datos en Java
Unconstructor esunmtodomiembroconelmismonombrequesuclase.Unconstructor
nopuededevolveruntipoperopuedesersobrecargado.
class complejo
{
public complejo(double x, double y){}
public complejo(complejo z){}
}
El constructor es un mtodo especial que se invoca cuando se crea un objeto. Se utiliza,
normalmente,parainicializarlosatributosdeunobjeto.Porlogeneral,almenossedefine
unconstructorsinargumentos,llamadoconstructorpordefecto.Encasodenodefinirseel
constructor,implcitamentequedadefinidounconstructorsinargumentosqueinicializacada
miembronumricoa 0,losmiembrosdetipo boolean a true ylasreferenciasanull.
Elprocesodecrearunobjetosellamainstanciacin(creacindeinstancia).EnJavasecrea
unobjetoconeloperador new yunconstructordelaclase.
Circulo C = new Circulo();
EnJava,laliberacindeobjetosesautomtica;cuandounobjetodejadeestarreferenciadopor
unavariableescandidatoaquelamemoriaqueocupasealiberaday,posteriormente,reutiliza-
da.Elprocesosedenominagarbagecollection,elmtodo System.gc() realizaelproceso.
Lospaquetessonagrupacionesdeclasesrelativasauntema.Elsistemasuministrapaquetescon
clasesquefacilitanlaprogramacin.Sepuedeafirmarqueelpaquetejava.langesdondeseen-
cuentranlasclasesmasutilizadas,porloqueesautomticamenteincorporadoalosprogramas.
Losmiembrosdeunaclasedefinidoscomo static noestnligadosalosobjetosdelaclase
sinoquesoncomunesatodoslosobjetos,sondelaclase.Secualificanconelnombredela
clase,porejemplo:
Math.sqrt(x);
EJERcicioS
2.1. Realizar una especificacin informal del TAD Conjunto con las operaciones:
ConjuntoVacio, Esvacio, Aadir un elemento al conjunto, Pertenece un elemento al
conjunto,Retirarunelementodelconjunto,Uniondedosconjuntos,Interseccinde
dosconjuntoseInclusindeconjuntos.
2.2. RealizarlaespecificacinformaldelTADConjuntoconlasoperacionesindicadas
enelEjercicio2.1.
ConsiderarlasoperacionesConjuntoVacioyAadircomoconstructores.
2.3. ConstruirelTADNaturalpararepresentarlosnmerosnaturales,conlasoperacio-
nes:Cero,Sucesor,EsCero,Igual,Suma,Antecesor,DiferenciayMenor.
Realizar la especificacin informal y formal considerando como constructores las
operacionesCeroySucesor.
Tipos de datos: Clases y objetos 57
2.4. Disear el TAD Bolsa como una coleccin de elementos no ordenados y que pu-
edenestarrepetidos.LasoperacionesdeltipoabstractosonCrearBolsa,Aadirun
elemento, BolsaVacia (verifica si tiene elemento), Dentro (verifica si un elementos
pertenece a la bolsa), Cuantos (determina el nmero de veces que se encuentra un
elemento),UnionyTotal.
Realizar la especificacin informal y formal considerando como constructores las
operacionesCrearBolsayAadir.
2.5. DisearelTADComplejopararepresentarlosnmeroscomplejos.Lasoperaciones
quesedebendefnirsonAsignaReal(asignaunvaloralapartereal),AsignaImaginaria
(asigna un valor a la parte imaginaria), ParteReal (devuelve la parte real de un
complejo),ParteImaginaria(devuelvelaparteimaginariadeuncomplejo),Modulo
deuncomplejoySumadedosnmeroscomplejos.Realizarlaespecifcacininformal
yformalconsiderandocomoconstructoreslasoperacionesquedesee.
2.6. Disear el tipo abstracto de datos Matriz con la finalidad de representar matrices
matemticas.LasoperacionesadefinirsonCrearMatriz(creaunamatriz,sinelemen-
tos, de m filas por n columnas), Asignar (asigna un elemento en la fila i, columna
j),ObtenerElemento(obtieneelelementodelafilai,ycolumnaj),Sumar(realiza
la suma de dos matrices cuando tienen las mismas dimensiones), ProductoEscalar
(obtienelamatrizresultantedemultiplicarcadaelementodelamatrizporunvalor).
Realizar la especificacin informal y formal considerando como constructores las
operacionesquedesee.
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)
{
58 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 siguiente
programa?
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 la siguiente clase, escribir el mtodo finalize() y un programa que cree
objetos,despuspierdalasreferenciasalosobjetoscreadosyseactiveelmtodo
finalize().
class Operador
{
public foat memoria;
public Operador(void)
{
System.out.println("Activar maquina operador");
memoria = 0.0F;
}
public foat sumar(foat f)
{
memoria += f;
return memoria;
}
}
2.11. Se desea realizar una clase Vector3d que permita manipular vectores de tres
componentes(coordenadasx, y, z)deacuerdoconlassiguientesnormas:
Sloposeeunmtodoconstructor.
Tieneunmtodomiembroequals()quepermitesabersidosvectorestienensus
componentesocoordenadasiguales.
2.12. IncluirenlaclaseVector3ddelEjercicio2.11elmtodonormamaxquepermitaobtener
lanormadedosvectores(Nota:Lanormadeunvectorv=x,y,zes

2 2 2
x y z + +
).
2.13. RealizarlaclaseComplejoquepermitalagestindenmeroscomplejos(unnmero
complejo=dosnmerosrealesdouble:unapartereal+unaparteimaginaria).Las
operacionesaimplementarsonlassiguientes:
establecer() permite inicializar un objeto de tipo Complejo a partir de dos
componentesdouble.
Tipos de datos: Clases y objetos 59
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 la clase Hora. Cada objeto de esta clase representa una hora espe-
cfica del da, almacenando las horas, minutos y segundos como enteros. Se ha
de incluir un constructor, mtodos de acceso, una mtodo adelantar(int h,
int m, int s)paraadelantarlahoraactualdeunobjetoexistente,unmtodo
reiniciar(int h, int m, int s)quereinicializalahoraactualdeunobjeto
existenteyunmtodoimprimir().
pRoBlEMaS
2.1. ImplementarelTADBolsadescritoenelEjercicio2.4.Probarlaimplementacincon
unprogramaqueinvoquealasoperacionesdeltipoabstractoBolsa.
2.2. ImplementarelTADMatrizespecificadoenelEjercicio2.6.Escribirunprogramaque
haciendousodeltipoMatrizrealiceoperacionesdiversas(lectura,suma...)yescriba
lasmatricesgeneradas.
2.3. ImplementarlaclaseFechaconmiembrosdatoparaelmes,dayao.Cadaobjeto
deestaclaserepresentaunafecha,quealmacenaelda,mesyaocomoenteros.
Sedebeincluirunconstructorpordefecto,mtodosdeacceso,unmtodoreini-
ciar (int d, int m, int a)parareiniciarlafechadeunobjetoexistente,un
mtodoadelantar(int d, int m, int a) paraavanzaraunafechaexistente
(dia,d;mes,m;yaoa)yunmtodoimprimir().Escribirunmtododeutilidad,
normalizar(), que asegure que los miembros dato estn en el rango correcto
1 ao, 1 mes 12, da das (mes),dondedas(Mes)esotromtodo
quedevuelveelnmerodedasdecadames.
2.4. Ampliarelprogramaanteriordemodoquepuedaaceptaraosbisiestos.
Nota:unaoesbisiestosiesdivisiblepor400,osiesdivisiblepor4peronopor100.
Porejemplo,losaos1992y2000sonaosbisiestosy1997y1900nosonbisiestos.

Anda mungkin juga menyukai