You are on page 1of 34

Unidad 8. Clases y objetos: un anlisis ms detallado.

8.2 Ejemplo prctico de la clase Tiempo Toda clase que usted declara representa un nuevo tipo en Java. Los mtodos public de una clase se conocen tambin como los servicios public de la clase, o su interfaz
public. El propsito principal de los estos mtodos es presentar a los clientes de la clase una vista de los servicios que esta proporciona. Los clientes de la clase no se necesitan preocupar por la forma en que esta realiza sus tareas. Por esta razn, los miembros de clase private no son directamente accesibles para los clientes de la clase. Un objeto que contiene datos consistentes tiene valores de datos que siempre se mantienen dentro del ran o. Un valor que se pasa a un mtodo para modificar una variable de instancia es un valor correcto, si se encuentra dentro del ran o permitido para la variable de instancia. Un valor correcto siempre consistente, pero un valor consistente no es correcto si un mtodo recibe un valor fuera de ran o, ! lo establece en un valor consistente para mantener el objeto en un estado consistente. El mtodo static format de la clase String es similar al mtodo System.out.printf, e"cepto que format devuelve un objeto String con formato, en vez de mostrarlo en una ventana de comandos. Todos los objetos en Java tienen un mtodo toString, que devuelve una representacin String del objeto. El mtodo toString se llama en forma impl#cita cuando aparece un objeto en el cdi o en donde se requiere un String.

!ig. 8.2: "ruebaTiempo#.java $$ %bjeto Tiempo& utilizado en una aplicacin. public class "ruebaTiempo# ' public static void main$ String args%& ' ( $$ crea e inicializa un objeto Tiempo& Tiempo& tiempo ( ne) Tiempo&*+, $$ invoca el constructor de Tiempo& imprime representaciones de cadena del tiempo -!stem.out.print* .La /ora universal inicial es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar inicial es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco modifica el tiempo e imprime el tiempo actuali)ado tiempo.establecerTiempo* &1, 23, 4 +, -!stem.out.print* .La /ora universal despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco establece el tiempo con valores invlidos* imprime el tiempo actuali)ado tiempo.establecerTiempo* 55, 55, 55 +, -!stem.out.println* .6espues de intentar ajustes invalidos0. +, -!stem.out.print* .7ora universal0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .7ora estandar0 . +, -!stem.out.println* tiempo.to-trin *+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaTiempo&

$$ 9i . :.20 PruebaTiempo&.java %bjeto Tiempo& utilizado en una aplicacin. public class "ruebaTiempo# ( public static void main$ String args%& ' ( $$ crea e inicializa un objeto Tiempo& Tiempo& tiempo ( ne) Tiempo&*+, $$ invoca el constructor de Tiempo# e iniciali)a sus variables en +. imprime representaciones de cadena del tiempo -!stem.out.print* .La /ora universal inicial es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar inicial es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco modifica el tiempo e imprime el tiempo actuali)ado tiempo.establecerTiempo* &1, 23, 4 +, -!stem.out.print* .La /ora universal despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco 8 $$ fin de main 8 $$ fin de la clase PruebaTiempo&

La /ora universal inicial es0 <<0<<0<< La /ora est=ndar inicial es0 &20<<0<< >? La /ora universal despus de establecerTiempo es0 &10230<4 La /ora est=ndar despus de establecerTiempo es0 &0230<4 P? -i despus se intentar ajustes inv=lidos *55,55,55+ nos dar#a como resultado0 7ora universal0 <<0<<0<< 7ora est=ndar0 &20<<0<< >?

8., Control del acceso a los miembros


;uando un mtodo que no es miembro de una clase trata de acceder a un miembro private de esa clase, se !ig. 8.,: "rueba-cceso.iembros.java /os miembros private de la clase Tiempo# no son accesibles.

public class "rueba-cceso.iembros ( public static void main$ String args%& ' ( Tiempo& tiempo ( ne) Tiempo&*+, $$ crea e inicializa un objeto Tiempo& tiempo./ora ( 3, $$ error0 /ora tiene acceso privado en Tiempo& tiempo.minuto ( &@, $$ error0 minuto tiene acceso privado en Tiempo& tiempo.se undo ( 1<, $$ error0 se undo tiene acceso privado en Tiempo& 8 $$ fin de main 8 $$ fin de la clase Prueba>cceso?iembros produce un error de compilacin.

PruebaAccesoMiembros.java:9: hora has private access in Tiempo1 tiempo.hora = 7; // error: hora tiene acceso privado en Tiempo1 ^ PruebaAccesoMiembros.java:1 : minuto has private access in Tiempo1 tiempo.minuto = 1!; // error: minuto tiene acceso privado en Tiempo1 ^

PruebaAccesoMiembros.java:11: se"undo has private access in Tiempo1 tiempo.se"undo = # ; // error: se"undo tiene acceso privado en Tiempo1 ^ # errors

8.0 1eferencias a los miembros del objeto actual mediante t2is Un mtodo no static de un objeto utiliza en forma impl#cita la palabra clave t2is para /acer referencia a
las variables de instancia del objeto, ! a los dem=s mtodos. La palabra clave t2is tambin se puede utilizar en forma e"pl#cita. El compilador produce un arc/ivo separado con la e"tensin .class para cada clase compilada. -i un mtodo contiene una variable local con el mismo nombre que uno de los campos de su clase, la variable local oculta el campo en el alcance del mtodo. El mtodo puede usar la referencia t2is para /acer referencia al campo oculto en forma e"pl#cita.

!ig. 8.0: "ruebaT2is.java

Uso impl3cito y e4pl3cito de t2is para 2acer referencia a los miembros de un objeto.

public class "ruebaT2is ( public static void main$ String args%& ' ( Tiempo-imple tiempo ( ne) Tiempo-imple* &@, 1<, &5 +, -!stem.out.println* tiempo.crear-trin *+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaT/is la clase TiempoSimple demuestra la referencia 5t2is5 class TiempoSimple ( private int /ora, $$ <A21 private int minuto, $$ <A@5 private int se undo, $$ <A@5 $$ -i el constructor utiliza nombres de par=metros idnticos a los nombres de las variables de instancia, $$ se requiere la referencia .t2is. para diferenciar unos nombres de otros public TiempoSimple$ int 2ora6 int minuto6 int segundo ' ( t/is./ora ( /ora, $$ establece la /ora del objeto .t/is. t/is.minuto ( minuto, $$ establece el minuto del objeto .t/is. t/is.se undo ( se undo, $$ establece el se undo del objeto .t/is. 8 $$ fin del constructor de Tiempo-imple $$ Usa la referencia .t/is. e"pl#cita e impl#cita para llamar a-trin Universal public String crearString$' ( return -trin .format* .B2Cs0 BsDnB2Cs0 Bs., .t/is.a-trin Universal*+., t/is.a-trin Universal*+, .a-trin Universal*+., a-trin Universal*+ +, 8 $$ fin del mtodo crear-trin $$ ;onvierte a -trin en formato de /ora universal *770??0--+ public String aStringUniversal$' ( $$ .t/is. no se requiere aqu# para acceder a las variables de instancia, !a que el mtodo no $$ tiene variables locales con los mismos nombres que las variables de instancia return -trin .format* .B<2d0B<2d0B<2d., t/is./ora, t/is.minuto, t/is.se undo +, 8 $$ fin del mtodo a-trin Universal 8 $$ fin de la clase Tiempo-imple

t/is.a-trin Universal*+0 &@01<0&5 a-trin Universal*+0 &@01<0&5

8.7 Ejemplo prctico de la clase Tiempo: constructores sobrecargados Los constructores sobrecar ados permiten inicializar los objetos de una clase de varias formas distintas.
El compilador diferencia a los constructores sobrecar ados en base a sus firmas.

!ig. 8.7: Tiempo2.java 8eclaraci9n de la clase Tiempo2 con constructores sobrecargados. public class Tiempo2 ( private int /ora, $$ < A 21 private int minuto, $$ < A @5 private int se undo, $$ < A @5 $$ ;onstructor de Tiempo2 sin ar umentos0 inicializa cada variable de instancia $$ a cero, ase ura que los objetos Tiempo2 empiecen en un estado consistente public Tiempo2$' ( t/is* <, <, < +, $$ invoca al constructor de Tiempo2 con tres ar umentos 8 $$ fin del constructor de Tiempo2 sin ar umentos $$ ;onstructor de Tiempo20 se suministra /ora, minuto ! se undo con valor predeterminado de < public Tiempo2$ int 2 ' ( t/is* /, <, < +, $$ invoca al constructor de Tiempo2 con tres ar umentos 8 $$ fin del constructor de Tiempo2 con un ar umento $$ ;onstructor de Tiempo20 se suministran /ora ! minuto, se undo con valor predeterminado de < public Tiempo2$ int 26 int m ' ( t/is* /, m, < +, $$ invoca al constructor de Tiempo2 con tres ar umentos 8 $$ fin del constructor de Tiempo2 con dos ar umentos $$ ;onstructor de Tiempo20 se suministran /ora, minuto ! se undo public Tiempo2$ int 26 int m6 int s ' ( establecerTiempo* /, m, s +, $$ invoca a establecerTiempo para validar el tiempo 8 $$ fin del constructor de Tiempo2 con tres ar umentos $$ ;onstructor de Tiempo20 se suministra otro objeto Tiempo2 public Tiempo2$ Tiempo2 tiempo ' ( $$ invoca al constructor de Tiempo2 con tres ar umentos t/is* tiempo.obtener7ora*+, tiempo.obtener?inuto*+, tiempo.obtener-e undo*+ +, 8 $$ fin del constructor de Tiempo2 con un objeto Tiempo2 como ar umento $$ ?todos .establecer. establece un nuevo valor de tiempo usando la /ora universal, ase ura que $$ los datos sean consistentes, estableciendo los valores inv=lidos en cero public void establecerTiempo$ int 26 int m6 int s ' ( establecer7ora* / +, $$ establece la /ora establecer?inuto* m +, $$ establece el minuto establecer-e undo* s +, $$ establece el se undo 8 $$ fin del mtodo establecerTiempo $$ valida ! establece la /ora public void establecer:ora$ int 2 ' ( /ora ( * * / E( < FF / G 2C + H / 0 < +, 8 $$ fin del mtodo establecer7ora $$ valida ! establece el minuto public void establecer.inuto$ int m ' ( minuto ( * * m E( < FF m G 4< + H m 0 < +, 8 $$ fin del mtodo establecer?inuto

La clase Tiempo2 con constructores sobrecar ados. *Parte & de 2+.

$$ valida ! establece el se undo public void establecerSegundo$ int s ' ( se undo ( * * s E( < FF s G 4< + H s 0 < +, 8 $$ fin del mtodo establecer-e undo $$ ?todos .obtener. obtiene el valor de la /ora public int obtener:ora$' ( return /ora, 8 $$ fin del mtodo obtener7ora $$ obtiene el valor del minuto public int obtener.inuto$' ' return minuto, 8 $$ fin del mtodo obtener?inuto $$ obtiene el valor del se undo public int obtenerSegundo$' ( return se undo, 8 $$ fin del mtodo obtener-e undo $$ convierte a -trin en formato de /ora universal *770??0--+ public String aStringUniversal$'( return -trin .format* .B<2d0B<2d0B<2d., obtener7ora*+, obtener?inuto*+, obtener-e undo*+ +, 8 $$ fin del mtodo a-trin Universal $$ convierte a -trin en formato de /ora est=ndar *70??0-- >? o P?+ public String toString$' ' return -trin .format* .Bd0B<2d0B<2d Bs., * *obtener7ora*+ (( < II obtener7ora*+ (( &2+ H &2 0 obtener7ora*+ B &2 +, obtener?inuto*+, obtener-e undo*+, * obtener7ora*+ G &2 H .>?. 0 .P?. + +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase Tiempo2

La clase Tiempo2 con constructores sobrecar ados. *Parte 2 de 2+. !ig. 8.;: "ruebaTiempo2.java Uso de constructores sobrecar ados para inicializar objetos Tiempo2.

public class PruebaTiempo2 ' public static void main* -trin ar sJK + ' Tiempo2 t& ( ne) Tiempo2*+, $$ <<0<<0<< Tiempo2 t2 ( ne) Tiempo2* 2 +, $$ <20<<0<< Tiempo2 t1 ( ne) Tiempo2* 2&, 1C +, $$ 2&01C0<< Tiempo2 tC ( ne) Tiempo2* &2, 2@, C2 +, $$ &202@0C2 Tiempo2 t@ ( ne) Tiempo2* 23, 3C, 55 +, $$ <<0<<0<< Tiempo2 t4 ( ne) Tiempo2* tC +, $$ &202@0C2 -!stem.out.println* .-e constru!o con0. +, -!stem.out.println* .t&0 todos los ar umentos predeterminados. +, -!stem.out.printf* . BsDn., t&.a-trin Universal*+ +, -!stem.out.printf* . BsDn., t&.to-trin *+ +, -!stem.out.println* .t20 se especifico /ora, minuto ! se undo predeterminados. +, -!stem.out.printf* . BsDn., t2.a-trin Universal*+ +, -!stem.out.printf* . BsDn., t2.to-trin *+ +,

La clase PruebaTiempo2. *Parte & de 2+.

-!stem.out.println* .t10 se especificaron /ora ! minuto, se undo predeterminado. +, -!stem.out.printf* . BsDn., t1.a-trin Universal*+ +, -!stem.out.printf* . BsDn., t1.to-trin *+ +, -!stem.out.println* .tC0 se especificaron /ora, minuto ! se undo. +, -!stem.out.printf* . BsDn., tC.a-trin Universal*+ +, -!stem.out.printf* . BsDn., tC.to-trin *+ +, -!stem.out.println* .t@0 se especificaron todos los valores invalidos. +, -!stem.out.printf* . BsDn., t@.a-trin Universal*+ +, -!stem.out.printf* . BsDn., t@.to-trin *+ +, -!stem.out.println* .t40 se especifico el objeto tC de Tiempo2. +, -!stem.out.printf* . BsDn., t4.a-trin Universal*+ +, -!stem.out.printf* . BsDn., t4.to-trin *+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaTiempo2

La clase PruebaTiempo2. *Parte 2 de 2+.

-e constru! con0 t&0 todos los ar umentos predeterminados <<0<<0<< &20<<0<< >? t20 se especific /ora, minuto ! se undo predeterminados <20<<0<< 20<<0<< >? t10 se especificaron /ora ! minuto, se undo predeterminado 2&01C0<< 501C0<< P? tC0 se especificaron /ora, minuto ! se undo &202@0C2 &202@0C2 P? t@0 se especificaron todos los valores inv=lidos <<0<<0<< 20<<0<< >? t40 se especific el objeto tC de Tiempo2 &202@0C2 &202@0C2 P?

8.; Constructores predeterminados y sin argumentos Toda clase debe tener por lo menos un constructor. -i no se proporciona uno, el compilador crea un
constructor predeterminado, que inicializa las variables de instancia con los valores iniciales especificados en sus declaraciones, o con sus valores predeterminados. -i una clase declara constructores, el compilador no crea un constructor predeterminado. Para especificar la inicializacin predeterminada para los objetos de una clase con varios constructores, el pro ramador debe declarar un constructor sin ar umentos.

8.< =bservaciones acerca de los m>todos Establecer y =btener Los mtodos establecer se conocen comLnmente como mtodos mutadores, !a que, por lo eneral,
cambian un valor.

Los mtodos obtener se conocen comLnmente como mtodos de acceso o de consulta. Un mtodo predicado evalLa si una condicin es verdadera o falsa.

8.8 Composici9n Una clase puede tener referencias a objetos de otras clases como miembros. > dic/a capacidad se le
conoce como composicin, ! al unas veces se le denomina relacin tiene un.

!ig. 8.<: !ec2a.java public class !ec2a ( private int mes, $$ &A&2 private int dia, $$ &A1& con base en el mes private int anio, $$ cualquier aMo

8eclaraci9n de la clase !ec2a.

$$ constructor0 llama a comprobar?es para confirmar el valor apropiado para el mes, $$ llama a comprobar6ia para confirmar el valor apropiado para el d#a public !ec2a$ int el.es6 int el8ia6 int el-nio ' ( mes ( comprobar?es* el?es +, $$ valida el mes anio ( el>nio, $$ pudo validar el aMo dia ( comprobar6ia* el6ia +, $$ valida el d#a -!stem.out.printf* .;onstructor de objeto 9ec/a para la fec/a BsDn., t/is +, 8 $$ fin del constructor de 9ec/a $$ mtodo utilitario para confirmar el valor apropiado del mes private int comprobar.es$ int mes"rueba '( if * mesPrueba E < FF mesPrueba G( &2 + $$ valida el mes return mesPrueba, else $$ mes es inv=lido ' -!stem.out.printf* .?es invalido *Bd+ se establecio en &.., mesPrueba +, return &, $$ mantiene el objeto en estado consistente 8 $$ fin de else 8 $$ fin del mtodo comprobar?es $$ mtodo utilitario para confirmar el valor apropiado del d#a, con base en el mes ! el aMo private int comprobar8ia$ int dia"rueba ' ( int diasPor?esJK ( ' <, 1&, 2:, 1&, 1<, 1&, 1<, 1&, 1&, 1<, 1&, 1<, 1& 8, $$ comprueba si el d#a est= dentro del ran o para el mes if * diaPrueba E < FF diaPrueba G( diasPor?esJ mes K + return diaPrueba, $$ comprueba si es aMo bisiesto if * mes (( 2 FF diaPrueba (( 25 FF * anio B C<< (( < II * anio B C (( < FF anio B &<< N( < + + + return diaPrueba, -!stem.out.printf* .6ia invalido *Bd+ se establecio en &.., diaPrueba +, return &, $$ mantiene el objeto en estado consistente 8 $$ fin del mtodo comprobar6ia $$ devuelve un objeto -trin de la forma mes$dia$anio public String toString$' ( return -trin .format* .Bd$Bd$Bd., mes, dia, anio +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase 9ec/a

!ig. 8.8: Empleado.java $$ ;lase Empleado con referencias a otros objetos. public class Empleado ( private -trin primerOombre, private -trin apellidoPaterno, private 9ec/a fec/aOacimiento, private 9ec/a fec/a;ontratacion, $$ constructor para inicializar nombre, fec/a de nacimiento ! fec/a de contratacin public Empleado$ String nombre6 String apellido6 !ec2a fec2a8e?acimiento6 !ec2a fec2a8eContratacion ' ( primerOombre ( nombre, apellidoPaterno ( apellido, fec/aOacimiento ( fec/a6eOacimiento, fec/a;ontratacion ( fec/a6e;ontratacion, 8 $$ fin del constructor de Empleado $$ convierte Empleado a formato -trin public String toString$' ( return -trin .format* .Bs, Bs ;ontratado0 Bs ;umpleanios0 Bs., apellidoPaterno, primerOombre, fec/a;ontratacion, fec/aOacimiento +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase Empleado

!ig. 8.@: "ruebaEmpleado.java

6emostracin de la composicin.

public class "ruebaEmpleado ( public static void main$ String args%& ' ( 9ec/a nacimiento ( ne) 9ec/a* 3, 2C, &5C5 +, 9ec/a contratacion ( ne) 9ec/a* 1, &2, &5:: +, Empleado empleado ( ne) Empleado* .Pob., .Plue., nacimiento, contratacion +, -!stem.out.println* empleado +, 8 $$ fin de main 8 $$ fin de la clase PruebaEmpleado

;onstructor de objeto 9ec/a para la fec/a 3$2C$&5C5 ;onstructor de objeto 9ec/a para la fec/a 1$&2$&5:: Plue, Pob ;ontratado0 1$&2$&5:: ;umpleanios0 3$2C$&5C5

8.@ Enumeraciones Todos los tipos enum son tipos por referencia. Un tipo enum se declara con una declaracin enum, que
es una lista separada por comas de constantes enum. La declaracin puede incluir, de manera opcional, otros componentes de las clases tradicionales, como0 constructores, campos ! mtodos. Los tipos enum son impl#citamente final, !a que declaran constantes que no deben modificarse. Las constantes enum son impl#citamente static. ;ualquier intento por crear un objeto de un tipo enum con el operador ne) produce un error de compilacin. Las constantes enum se pueden utilizar en cualquier parte en donde pueden usarse constantes, como en las etiquetas case de las instrucciones sAitc2 ! para controlar las instrucciones for mejoradas. ;ada constante enum en una declaracin enum va se uida opcionalmente de ar umentos que se pasan al constructor de la enum. Para cada enum, el compilador enera un mtodo static llamado values, que devuelve un arre lo de las constantes de la enum, en el orden en el que se declararon. El mtodo static range de EnumSet recibe dos par=metros0 la primera constante enum en un ran o ! la Lltima constante enum en un ran o, ! devuelve un objeto EnumSet que contiene todas las constantes entre estas dos constantes, inclusive.

!ig. 8.#+: /ibro.java 6eclara un tipo enum con constructor ! campos de instancia e"pl#citos, $$ junto con mtodos de acceso para estos campos public enum /ibro ( $$ declara constantes de tipo enum J7TP4* .Java 7o) to Pro ram 4e., .2<<@. +, ;7TPC* .; 7o) to Pro ram Ce., .2<<C. +, QR17TP1* .Qnternet F Rorld Ride Reb 7o) to Pro ram 1e., .2<<C. +, ;PP7TPC* .;SS 7o) to Pro ram Ce., .2<<1. +, TP7TP2* .Tisual Pasic .OET 7o) to Pro ram 2e., .2<<2. +, ;-7>UP7TP* .;V 7o) to Pro ram., .2<<2. +, $$ campos de instancia private final -trin titulo, $$ t#tulo del libro private final -trin anio;op!ri /t, $$ aMo de cop!ri /t $$ constructor de enum /ibro$ String titulo/ibro6 String anio ' ( titulo ( tituloLibro, anio;op!ri /t ( anio, 8 $$ fin de constructor de enum Libro $$ mtodo de acceso para el campo titulo public String obtenerTitulo$' ( return titulo, 8 $$ fin del mtodo obtenerTitulo $$ mtodo de acceso para el campo anio;op!ri /t public String obtener-nioCopyrig2t$' ( return anio;op!ri /t, 8 $$ fin del mtodo obtener>nio;op!ri /t 8 $$ fin de enum Libro

!ig. 8.##: "ruebaEnum.java import java.util.Enum-et, public class "ruebaEnum ( public static void main$ String args%& ' ( -!stem.out.println* .Todos los libros0Dn. +, $$ imprime todos los libros en enum Libro for * Libro libro 0 Libro.values*+ + -!stem.out.printf* .BA&<sBAC@sBsDn., libro, libro.obtenerTitulo*+, libro.obtener>nio;op!ri /t*+ +,

Prueba del tipo enum Libro.

-!stem.out.println* .Dn?ostrar un ran o de constantes enum0Dn. +, $$ imprime los primeros cuatro libros for * Libro libro 0 Enum-et.ran e* Libro.J7TP4, Libro.;PP7TPC + + -!stem.out.printf* .BA&<sBAC@sBsDn., libro, libro.obtenerTitulo*+, libro.obtener>nio;op!ri /t*+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaEnum

8.#+ 1ecolecci9n de basura y el m>todo finali)e Toda clase en Java tiene los mtodos de la clase =bject, uno de los cuales es finali)e. La ?=quina Tirtual de Java *JT?+ realiza la recoleccin autom=tica de basura para reclamar la memoria
que ocupan los objetos que !a no se utilizan. ;uando !a no /a! m=s referencias a un objeto, la JT? lo marca para la recoleccin de basura. La memoria para dic/o objeto se puede reclamar cuando la JT? ejecuta su recolector de basura. El mtodo finali)e es invocado por el recolector de basura, justo antes de que reclame la memoria del objeto. El mtodo finali)e no recibe par=metros ! tiene el tipo de retorno void. Tal vez el recolector de basura nunca se ejecute antes de que un pro rama termine. Por lo tanto, no queda claro si se /ar= una llamada al mtodo finali)e *o cuando se /ar=+.

8.## .iembros de clase static Una variable static representa la informacin a nivel de clase que se comparte entre todos los objetos de
la clase. Las variables static tienen alcance en toda la clase. -e puede tener acceso a los miembros public static de una clase a travs de una referencia a cualquier objeto de la clase, o calificando el nombre del miembro con el nombre de la clase ! un punto *.+. El acceso a los miembros private static de una clase se obtiene solo a travs de los mtodos de la clase. Los miembros de clase static e"isten aun cuando no e"istan objetos de la clase, est=n disponibles tan pronto como se car a la clase en memoria, en tiempo de ejecucin. Para acceder a un miembro private static cuando no e"isten objetos de la clase, debe proporcionarse un mtodo public static. El mtodo static c de la clase System indica que el recolector de basura debe realizar su mejor esfuerzo al tratar de reclamar objetos que sean candidatos para la recoleccin de basura. Un mtodo que se declara como static no puede acceder a los miembros de clase que no son static, !a que un mtodo static puede llamarse incluso aunque no se /a!an creado instancias de objetos de la clase. La referencia t2is no puede utilizarse en un mtodo static.

!ig. 8.#2: Empleado.java $$ Tariable static que se utiliza para mantener una cuenta del nLmero de objetos Empleado en la memoria. public class Empleado ( private -trin primerOombre, private -trin apellidoPaterno, private static int cuenta ( <, $$ nLmero de objetos en memoria
$$ inicializa empleado, suma & a la variable static cuenta e imprime objeto -trin que indica que se llam al constructor

public Empleado$ String nombre6 String apellido ' ( primerOombre ( nombre, apellidoPaterno ( apellido,

9i . :.&20 Empleado.java I &ra parte

cuentaSS, $$ incrementa la variable static cuenta de empleados -!stem.out.printf* .;onstructor de Empleado0 Bs Bs, cuenta ( BdDn., primerOombre, apellidoPaterno, cuenta +, 8 $$ fin de constructor de Empleado $$ resta & a la variable static cuenta cuando el recolector $$ de basura llama a finalize para borrar el objeto, $$ confirma que se llam a finalize protected void finali)e$' ( cuentaAA, $$ decrementa la variable static cuenta de empleados -!stem.out.printf* .9inalizador de Empleado0 Bs Bs, cuenta ( BdDn., primerOombre, apellidoPaterno, cuenta +, 8 $$ fin del mtodo finalize $$ obtiene el primer nombre public String obtener"rimer?ombre$' ( return primerOombre, 8 $$ fin del mtodo obtenerPrimerOombre $$ obtiene el apellido paterno public String obtener-pellido"aterno$' ( return apellidoPaterno, 8 $$ fin del mtodo obtener>pellidoPaterno $$ mtodo static para obtener el valor de la variable static cuenta public static int obtenerCuenta$' ( return cuenta, 8 $$ fin del mtodo obtener;uenta 8 $$ fin de la clase Empleado

9i . :.&20 Empleado.java I 2da parte !ig. 8.#,: "ruebaEmpleado.java 6emostracin de miembros static. public class "ruebaEmpleado ( public static void main$ String args%& ' ( $$ muestra que la cuenta es < antes de crear Empleados -!stem.out.printf* .Empleados antes de instanciar0 BdDn., Empleado.obtener;uenta*+ +, $$ crea dos Empleados, la cuenta debe ser 2 Empleado e& ( ne) Empleado* .-usan., .PaWer. +, Empleado e2 ( ne) Empleado* .Pob., .Plue. +, $$ muestra que la cuenta es 2 despus de crear dos Empleados -!stem.out.println* .DnEmpleados despues de instanciar0 . +, -!stem.out.printf* .mediante e&.obtener;uenta*+0 BdDn., e&.obtener;uenta*+ +, -!stem.out.printf* .mediante e2.obtener;uenta*+0 BdDn., e2.obtener;uenta*+ +, -!stem.out.printf* .mediante Empleado.obtener;uenta*+0 BdDn., Empleado.obtener;uenta*+ +, $$ obtiene los nombres de los Empleados -!stem.out.printf* .DnEmpleado &0 Bs BsDnEmpleado 20 Bs BsDnDn., e&.obtenerPrimerOombre*+, e&.obtener>pellidoPaterno*+, e2.obtenerPrimerOombre*+, e2.obtener>pellidoPaterno*+ +,

9i . :.&10 PruebaEmpleado.java

I &ra parte

$$ en este ejemplo, slo /a! una referencia a cada Empleado, $$ por lo que las si uientes dos instrucciones /acen que la JT? $$ marque a cada objeto Empleado para la recoleccin de basura e& ( null, e2 ( null, -!stem. c*+, $$ pide que la recoleccin de basura se realice a/ora $$ muestra la cuenta de Empleados despus de llamar al recolector de basura, $$ la cuenta a mostrar puede ser <, & o 2 dependiendo de si el recolector de $$ basura se ejecuta de inmediato, ! del nLmero de objetos Empleado recolectados -!stem.out.printf* .DnEmpleados despues de -!stem. c*+0 BdDn., Empleado.obtener;uenta*+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaEmpleado

9i . :.&10 PruebaEmpleado.java

I 2da parte

8.#2 8eclaraci9n static import Una declaracin static import permite a los pro ramadores /acer referencia a los miembros static
importados, sin tener que utilizar el nombre de la clase ! un punto *.+. Una declaracin static import individual importa un miembro static, ! una declaracin static import sobre demanda importa a todos los miembros static de una clase.

!ig. 8.#0: "ruebaStaticCmport.java Uso de static import para importar mtodos static de la clase ?at/. import static java.lang..at2.D* public class "ruebaStaticCmport ( public static void main$ String args%& ' ( -!stem.out.printf* .sqrt* 5<<.< + ( B.&fDn., sqrt* 5<<.< + +, -!stem.out.printf* .ceil* A5.: + ( B.&fDn., ceil* A5.: + +, -!stem.out.printf* .lo * E + ( B.&fDn., lo * E + +, -!stem.out.printf* .cos* <.< + ( B.&fDn., cos* <.< + +, 8 $$ fin de main 8 $$ fin de la clase Prueba-taticQmport

s$rt% 9 . & = # . cei'% (9.) & = (9. 'o"% * & = 1. cos% . & = 1.

8.#, Bariables de instancia final En el conte"to de una aplicacin, el principio del menor privile io establece que al cdi o se le debe
otor ar solo el nivel de privile io ! de acceso que necesita para realizar su tarea desi nada. La palabra clave final especifica que una variable no puede modificarse, en otras palabras, es constante. Las constantes pueden inicializarse cuando se declaran, o por medio de cada uno de los constructores de una clase. -i una variable final no se inicializa, se produce un error de compilacin.

!ig. 8.#7: Cncremento.java

variable de instancia final en una clase.

public class Cncremento ( private int total ( <, $$ el total de todos los incrementos private final int QO;UE?EOT%, $$ variable constante *sin inicializar+ $$ el constructor inicializa la variable de instancia final QO;UE?EOT% public Cncremento$ int valorCncremento ' ( QO;UE?EOT% ( valorQncremento, $$ inicializa la variable constante *una vez+ 8 $$ fin del constructor de Qncremento $$ suma QO;UE?EOT% al total public void sumarCncremento-Total$' ( total S( QO;UE?EOT%, 8 $$ fin del mtodo sumarQncremento>Total $$ devuelve representacin -trin de los datos de un objeto Qncremento public String toString$' ( return -trin .format* .total ( Bd., total +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase Qncremento

!ig. 8.#;: "ruebaCncremento.java variable final inicializada con el ar umento de un constructor. public class "ruebaCncremento ( public static void main$ String args%& ' ( Qncremento valor ( ne) Qncremento* @ +, -!stem.out.printf* .>ntes de incrementar0 BsDnDn., valor +, for $ int i E #* i FE ,* iGG ' ( valor.sumarQncremento>Total*+, -!stem.out.printf* .6espues de incrementar Bd0 BsDn., i, valor +, 8 $$ fin de for 8 $$ fin de main 8 $$ fin de la clase PruebaQncremento

>ntes de incrementar0 total ( < 6espues de incrementar &0 total ( @ 6espues de incrementar 20 total ( &< 6espues de incrementar 10 total ( &@

8.#0 1eutili)aci9n de softAare El soft)are se constru!e a partir de componentes e"istentes, bien definidos, cuidadosamente probados,
bien documentados, portables ! con amplia disponibilidad. La reutilizacin de soft)are a iliza el desarrollo de soft)are poderoso, de alta calidad. El desarrollo r=pido de aplicaciones *U>6+ es de ran inters /o! en d#a. >/ora, los pro ramadores de Java tienen miles de clases en la >PQ a su disposicin, para a!udarse a implementar pro ramas en Java. Las clases de la >PQ de Java permiten a los pro ramadores de Java

llevar nuevas aplicaciones al mercado con m=s rapidez, mediante el uso de componentes preAe"istentes ! probados.

8.#7 -bstracci9n de datos y encapsulamiento El cliente de una clase se preocupa acerca de la funcionalidad que esta ofrece, pero no acerca de como
se implementa esta funcionalidad. > esto se le conoce como abstraccin de datos. >unque los pro ramadores pueden conocer los detalles de la implementacin de una clase, no deben escribir cdi o que dependa de estos detalles. Esto nos permite reemplazar una clase con otra versin, sin afectar el resto del sistema. Un tipo de datos abstracto *>6T+ consiste en una representacin de datos ! las operaciones que pueden realizarse con esos datos.

8.#; Ejemplo prctico de la clase Tiempo: creaci9n de paHuetes ;ada clase en la >PQ de Java pertenece a un paquete que contiene un rupo de clases relacionadas. Los
paquetes a!udan a administrar la complejidad de los componentes de una aplicacin, ! facilitan la reutilizacin de soft)are. Los paquetes proporcionan una convencin para los nombres de clases Lnicos, que a!uda a evitar los conflictos de nombres de clases. >ntes de poder importar una clase en varias aplicaciones, esta debe colocarse en un paquete. -olo puede /aber una declaracin pacIage en cada arc/ivo de cdi o fuente de Java, ! debe ir antes de todas las dem=s declaraciones e instrucciones en el arc/ivo. ;ada nombre de paquete debe empezar con el nombre de dominio de Qnternet del pro ramador, en orden inverso. Una vez que se invierte el nombre de dominio, podemos ele ir cualquier otro nombre que deseemos para nuestro paquete. >l compilar una clase en un paquete, la opcin Ad de l#nea de comandos de javac especifica en donde se debe almacenar el paquete, ! /ace que el compilador cree los directorios del paquete, en caso de que no e"istan. El nombre del paquete forma parte del nombre completamente calificado de una clase. Esto a!uda a evitar los conflictos de nombres. Una declaracin import de tipo simple especifica una clase a importar. Una declaracin import de tipo por demanda solo importa las clases que el pro rama utilice de un paquete espec#fico. El compilador utiliza un car ador de clases para localizar las clases que necesita en la ruta de clases. La ruta de clases consiste en una lista de directorios o arc/ivos de fi c/eros, cada uno separado por un separador de directorio. La ruta de clases para el compilador ! la JT? se puede especificar proporcionando la opcion Xclasspat2 al comando javac o java, o estableciendo la variable de entorno ;L>--P>T7. La ruta de clases para la JT? tambin se puede especificar mediante la opcion Acp de l#nea de comandos. -i las clases deben

!ig. 8.#8: Tiempo#.java La declaracin de la clase Tiempo& mantiene la /ora en formato de 2C /oras. pacWa e com.deitel.j/tp3.cap<:, public class Tiempo# ( private int /ora, $$ < A 21 private int minuto, $$ < A @5 private int se undo, $$ < A @5 $$ establece un nuevo valor de tiempo, usando la /ora universal, ase ura que los datos sean consistentes, al $$ establecer los valores inv=lidos a cero public void establecerTiempo$ int 26 int m6 int s ' ( /ora ( * * / E( < FF / G 2C + H / 0 < +, $$ valida la /ora minuto ( * * m E( < FF m G 4< + H m 0 < +, $$ valida el minuto se undo ( * * s E( < FF s G 4< + H s 0 < +, $$ valida el se undo 8 $$ fin del mtodo establecerTiempo car arse del directorio actual, inclu!a un punto *.+ en la ruta de clases.

$$ convierte a objeto -trin en formato de /ora universal *770??0--+ public String aStringUniversal$' ( return -trin .format* .B<2d0B<2d0B<2d., /ora, minuto, se undo +, 8 $$ fin del mtodo a-trin Universal $$ convierte a objeto -trin en formato de /ora est=ndar *70??0-- >? or P?+ public String toString$' ( return -trin .format* .Bd0B<2d0B<2d Bs., * * /ora (( < II /ora (( &2 + H &2 0 /ora B &2 +, minuto, se undo, * /ora G &2 H .>?. 0 .P?. + +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase Tiempo& 9i . :.&:0 Tiempo&.java I &ra Parte

9i . :.&:0 Tiempo&.java

I 2da Parte

!ig. 8.#@: "rueba"aHueteTiempo#.java $$ Uso de un objeto Tiempo& en una aplicacin. import com.deitel.j/tp3.cap<:.Tiempo&, $$ importa la clase Tiempo& public class "rueba"aHueteTiempo# ( public static void main$ String args%& ' ( $$ crea e inicializa un objeto Tiempo& Tiempo& tiempo ( ne) Tiempo&*+, $$ llama al constructor de Tiempo& $$ imprime representaciones -trin de la /ora -!stem.out.print* .La /ora universal inicial es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar inicial es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco $$ cambia la /ora e imprime la /ora actualizada tiempo.establecerTiempo* &1, 23, 4 +, -!stem.out.print* .La /ora universal despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .La /ora estandar despues de establecerTiempo es0 . +, -!stem.out.println* tiempo.to-trin *+ +, -!stem.out.println*+, $$ imprime una l#nea en blanco $$ establece la /ora con valores inv=lidos, imprime la /ora actualizada tiempo.establecerTiempo* 55, 55, 55 +, -!stem.out.println* .6espues de intentar ajustes invalidos0. +, -!stem.out.print* .7ora universal0 . +, -!stem.out.println* tiempo.a-trin Universal*+ +, -!stem.out.print* .7ora estandar0 . +, -!stem.out.println* tiempo.to-trin *+ +, 8 $$ fin de main 8 $$ fin de la clase PruebaPaqueteTiempo&

La /ora universal inicial es0 <<0<<0<< La /ora estandar inicial es0 &20<<0<< >? La /ora universal despues de establecerTiempo es0 &10230<4 La /ora estandar despues de establecerTiempo es0 &0230<4 P? 6espues de intentar ajustes invalidos0 7ora universal0 <<0<<0<< 7ora estandar0 &20<<0<< >?

8.#< -cceso a paHuetes -i no se especifica un modificador de acceso para un mtodo o variable al momento de su declaracin en
una clase, se considera que el mtodo o variable tiene acceso a nivel de paquete.

!ig. 8.2+: "rueba8atos"aHuete.java $$ Los miembros con acceso a nivel de paquete de una clase son accesibles $$ para las dem=s clases en el mismo paquete. public class "rueba8atos"aHuete ( public static void main$ String args%& ' ( 6atosPaquete datosPaquete ( ne) 6atosPaquete*+, $$ imprime la representacin -trin de datosPaquete -!stem.out.printf* .6espues de instanciar0DnBsDn., datosPaquete +, $$ modifica los datos con acceso a nivel de paquete en el objeto datosPaquete datosPaquete.numero ( 33, datosPaquete.cadena ( .>dios., $$ imprime la representacin -trin de datosPaquete -!stem.out.printf* .Dn6espues de modificar valores0DnBsDn., datosPaquete +, 8 $$ fin de main 8 $$ fin de la clase Prueba6atosPaquete $$ clase con variables de instancia con acceso a nivel de paquete class 8atos"aHuete ( int numero, $$ variable de instancia con acceso a nivel de paquete -trin cadena, $$ variable de instancia con acceso a nivel de paquete $$ constructor public 8atos"aHuete$' ( numero ( <, cadena ( .7ola., 8 $$ fin del constructor de 6atosPaquete $$ devuelve la representacin -trin del objeto 6atosPaquete public String toString$' ( return -trin .format* .numero0 Bd, cadena0 Bs., numero, cadena +, 8 $$ fin del mtodo to-trin 8 $$ fin de la clase 6atosPaquete

6espues de instanciar0 numero0 <, cadena0 7ola 6espues de modificar valores0 numero0 33, cadena0 >dios

You might also like