Вы находитесь на странице: 1из 19

24/4/2014

ENI Training - Libro online

Puesta en prctica con Java


En el resto del captulo, vamos a trabajar en la clase P e r s o n acuya representacin UML (Unified Modeling Language) es como sigue.

UML es un lenguaje grfico destinado a la representacin de los conceptos de programacin orientada a objetos. Para ms informacin sobre este lenguaje, puede consultar el manual UML 2 en la coleccin Recursos Informticos de Ediciones ENI.

1. Creacin de una clase


La creacin de una clase consiste en declarar sta y todos los elementos que la componen.

a. Declaracin de la clase
La declaracin de una clase se lleva a cabo utilizando la palabra clave c l a s sseguida del nombre de la clase y de un bloque de cdigo delimitado por los caracteres { y } (llaves). En este bloque de cdigo se encuentran las declaraciones de variables que sern los campos de la clase y las funciones que sern los mtodos de la clase. Se pueden aadir varias palabras clave para modificar las caractersticas de la clase. Por lo tanto, la sintaxis de la declaracin de una clase es la siguiente.

[ l i s t ad em o d i f i c a d o r e s ]c l a s sN o m b r e D e L a C l a s e[ e x t e n d s N o m b r e D e L a C l a s e B a s i c a ] [ i m p l e m e n t sN o m b r e D e I n t e r f a z 1 , N o m b r e D e I n t e r f a z 2 , . . . ]
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 1/19

24/4/2014

ENI Training - Libro online

{ C d i g od el ac l a s e } Los signos [ y ] (corchetes) son utilizados para indicar qu elemento es opcional. No se deben utilizar en el cdigo de declaracin de una clase. Los modificadores permiten determinar la visibilidad de la clase y cmo ser utilizada. A continuacin presentamos la lista de los modificadores disponibles:

p u b l i c : indica que la clase puede ser utilizada por cualquier otra clase. Sin este modificador, la clase
slo ser utilizable por clases que forman parte del mismo paquete.

a b s t r a c t : indica que la clase es abstracta y no puede ser instanciada. Slo se la puede utilizar como
clase bsica en una relacin de herencia. En este tipo de clase, slo se suele definir las declaraciones de mtodos, y habr que escribir el contenido de los mtodos en las clases derivadas.

f i n a l : la clase no puede ser utilizada como clase de base en una relacin de herencia y slo puede
ser instanciada. Al ser contradictorio el significado de las palabras clave a b s t r a c ty f i n a l , su uso simultneo est prohibido. Para indicar que su clase recupera las caractersticas de otra clase por una relacin de herencia, debe utilizar la palabra clave e x t e n d sseguida del nombre de la clase base. Tambin puede implementar en su clase una o varias interfaces utilizando la palabra i m p l e m e n t sseguida de la lista de las interfaces implementadas. Se detallarn estas dos nociones ms adelante en este captulo. El inicio de la declaracin de nuestra clase P e r s o n aes, por lo tanto, el siguiente:

p u b l i cc l a s sP e r s o n a { } Se debe introducir obligatoriamente este cdigo en un fichero que lleve el mismo nombre que la clase y la extensin .java.

b. Creacin de los campos


Ahora, nos vamos a interesar en el contenido de nuestra clase. Debemos crear los diferentes campos de la clase. Para ello, basta con declarar variables en el interior del bloque de cdigo de la clase e indicar la visibilidad de la variable, su tipo y su nombre. [ p r i v a t e|p r o t e c t e d|p u b l i c ]t i p o D e L a V a r i a b l en o m b r e D e L a V a r i a b l e ; La visibilidad de la variable responde a las reglas siguientes:

p r i v a t e : la variable slo es accesible en la clase donde est declarada. p r o t e c t e d : la variable es accesible en la clase donde est declarada, en las otras clases que forman
parte del mismo paquete y en las clases que heredan la clase donde esa misma variable est declarada.

p u b l i c : la variable es accesible desde cualquier ubicacin.


Si no se proporciona ninguna informacin relativa a la visibilidad, la variable es accesible desde la clase donde est declarada y desde las otras clases que forman parte del mismo paquete. Cuando
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 2/19

24/4/2014

ENI Training - Libro online

elejimos la visibilidad de una variable, debemos respetar en lo posible el principio de encapsulacin y limitar al mximo la visibilidad de las variables. Lo ideal sera tener siempre variables p r i v a t eo p r o t e c t e dpero nunca p u b l i c . La variable debe tambin tener un tipo. No hay limite en cuanto al tipo de una variable y por lo tanto podemos utilizar tanto los tipos bsicos del lenguaje Java tales como i n t ,f l o a t ,c h a r como tipos de objetos. En cuanto al nombre de la variable, debe respetar sencillamente las reglas de nombramiento (no utilizar palabras clave del lenguaje). Ahora, por lo tanto, la clase P e r s o n atiene la forma siguiente:

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o ; p r i v a t eS t r i n gn o m b r e ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i ; }

c. Creacin de mtodos
Los mtodos son simplemente funciones definidas en el interior de una clase. Se suelen utilizar para manipular los campos de la clase. La sintaxis general de declaracin de un mtodo est descrita a continuacin.

[ m o d i f i c a d o r e s ]t i p o D e R e t o r n on o m b r e D e l M t o d o( [ l i s t a D e L o s P a r m e t r o s ] ) [ t h r o w sl i s t a E x c e p c i n ] { } Java cuenta con los siguientes modificadores:

p r i v a t e : indica que el mtodo slo puede ser usado en la clase donde est definido. p r o t e c t e d : indica que slo se puede utilizar el mtodo en la clase donde est definido, en las
subclases de esta clase y en las otras clases que forman parte del mismo paquete.

p u b l i c : indica que se puede utilizar el mtodo desde cualquier otra clase.


Si no se utiliza ninguna de estas palabras, entonces la visibilidad se limitar al paquete donde est definida la clase.

s t a t i c : indica que el mtodo es un mtodo de clase. a b s t r a c t : indica que el mtodo es abstracto y que no contiene cdigo. La clase donde est definido
tambin debe ser abstracta.

f i n a l : indica que el mtodo no puede ser sobrescrito en una subclase. n a t i v e : indica que el cdigo del mtodo se encuentra en un fichero externo escrito en otro lenguaje. s y n c h r o n i z e d : indica que el mtodo slo puede ser ejecutado por un nico hilo a la vez.
El tipo de retorno puede ser cualquier tipo de dato, tipo bsico del lenguaje o tipo objeto. Si el mtodo no tiene informacin a devolver, deberemos usar la palabra clave v o i den sustitucin del tipo de retorno.
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 3/19

24/4/2014

ENI Training - Libro online

La lista de los parmetros es idntica a una lista de declaracin de variables. Hay que especificar el tipo y el nombre del parmetro. Si se esperan varios parmetros, hay que separar sus declaraciones con una coma. Incluso si no se espera ningn parmetro, los parntesis son obligatorios. La palabra clave t h r o w s indica la lista de excepciones que este mtodo puede lanzar durante su ejecucin. Aadimos dos mtodos a nuestra clase P e r s o n a .

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o ; p r i v a t eS t r i n gn o m b r e ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i ; p u b l i cl o n gc a l c u l o E d a d ( ) { l o n ge d a d ; f e c h a _ n a c i = n e wG r e g o r i a n C a l e n d a r ( 1 9 6 3 , 1 1 , 2 9 ) ; e d a d = n e wG r e g o r i a n C a l e n d a r ( ) . g e t T i m e I n M i l l i s ( ) f e c h a _ n a c i . g e t T i m e I n M i l l i s ( ) ; e d a d = e d a d / 1 0 0 0 / 6 0 / 6 0 / 2 4 / 3 6 5 ; r e t u r ne d a d ; } p u b l i cv o i dv i s u a l i z a c i n ( ) { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+a p e l l i d o ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+n o m b r e ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; } } En algunos lenguajes de programacin, no es posible tener varias funciones con el mismo nombre. El lenguaje Java, como muchos otros lenguajes orientados a objeto, permite esquivar el problema al crear funciones sobrecargadas. Una funcin sobrecargada lleva el mismo nombre que otra funcin de la clase pero presenta una firma diferente. Se toma en cuenta la informacin siguiente para determinar la firma de una funcin: el nombre de la funcin el nmero de parmetros esperados por la funcin el tipo de los parmetros. Para poder crear una funcin sobrecargada, hace falta que al menos uno de sus elementos cambie respeto a una funcin ya existente. Como el nombre de la funcin debe seguir siendo el mismo para poder hablar de sobrecarga, slo podemos actuar en el nmero de parmetros o su tipo. Por ejemplo, podemos aadir la funcin siguiente a la clase P e r s o n a :

p u b l i cv o i dv i s u a l i z a c i n ( b o o l e a ne s p a o l ) { i f( e s p a o l ) { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+a p e l l i d o ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+n o m b r e ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; } e l s e


http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 4/19

24/4/2014

ENI Training - Libro online

{ S y s t e m . o u t . p r i n t l n ( " n a m e :"+a p e l l i d o ) ; S y s t e m . o u t . p r i n t l n ( " f i r s tn a m e :"+n o m b r e ) ; S y s t e m . o u t . p r i n t l n ( " a g e :"+c a l c u l o E d a d ( ) ) ; } } En efecto, posee una firma diferente de la primera funcin v i s u a l i z a c i nque hemos creado ya que espera un parmetro de tipo b o o l e a n . Si ahora aadimos la funcin siguiente, el compilador rechaza la compilacin del cdigo.

p u b l i cv o i dv i s u a l i z a c i n ( b o o l e a nm a y s c u l a ) { i f( m a y s c u l a ) { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+a p e l l i d o . t o U p p e r C a s e ( ) ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+n o m b r e . t o U p p e r C a s e ( ) ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; } e l s e { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+a p e l l i d o . t o L o w e r C a s e ( ) ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+n o m b r e . t o L o w e r C a s e ( ) ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; } } De hecho determina que dos funciones tienen rigurosamente la misma firma, el mismo nombre, el mismo nmero de parmetros, incluso el mismo tipo de parmetros. Este ejemplo nos muestra tambin que el nombre de los parmetros no se tiene en cuenta para determinar la firma de una funcin. Se puede disear una funcin para aceptar un nmero variable de parmetros. La primera solucin consiste en usar como parmetro un array y comprobar en el cdigo de la funcin el tamao de dicho array para obtener los parmetros. Sin embargo, esta solucin requiere la creacin de un array en el momento de la llamada a la funcin. Por lo tanto no es tan fcil como el uso de una lista de parmetros. Para simplificar la llamada a este tipo de funcin, podemos utilizar la declaracin siguiente para indicar que una funcin espera un nmero cualquiera de parmetros.

p u b l i cv o i dv i s u a l i z a c i n ( S t r i n g . . . c o l o r e s ) { { i f( c o l o r e s = = n u l l ) { S y s t e m . o u t . p r i n t l n ( " n i n g u nc o l o r " ) ; r e t u r n ; } s w i t c h( c o l o r e s . l e n g t h ) { c a s e1 : S y s t e m . o u t . p r i n t l n ( " u nc o l o r " ) ; b r e a k ; c a s e2 : S y s t e m . o u t . p r i n t l n ( " d o sc o l o r e s " ) ; b r e a k ; c a s e3 : S y s t e m . o u t . p r i n t l n ( " t r e sc o l o r e s " ) ;


http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 5/19

24/4/2014

ENI Training - Libro online

b r e a k ; d e f a u l t : S y s t e m . o u t . p r i n t l n ( " m sd et r e sc o l o r e s " ) ; } } } En el interior del mtodo, el parmetro c o l o r e s se considera como un array (de cadenas de caracteres en nuestro caso). Por el contrario, durante la llamada a la funcin, utilizamos una lista de cadenas de caracteres separadas por comas. Las sintaxis siguientes son perfectamente vlidas para la llamada a esta funcin.

p . v i s u a l i z a c i n ( " r o j o " ) ; p . v i s u a l i z a c i n ( " v e r d e " , " a z u l " , " r o j o " ) ; p . v i s u a l i z a c i n ( ) ; Slo hay una pequea anomala en el momento de la ejecucin, porque la ltima llamada de la funcin visualizacin no ejecuta la funcin que acabamos de disear sino la primera versin que no espera parmetro. En efecto, el compilador no puede adivinar que se trata de la versin que espera un nmero variable de parmetros que deseamos ejecutar sin pasarle parmetros. Por lo tanto para indicarle nuestra intencin, debemos llamar a la funcin con la sintaxis siguiente. p . v i s u a l i z a c i n ( n u l l ) ; En el momento de la llamada a una funcin, los parmetros son pasados por valores tanto para los tipos bsicos del lenguaje (i n t ,f l o a t ,b o o l e a n ) como para los tipos objetos. Sin embargo, si un objeto es pasado como parmetro a una funcin, el cdigo de la funcin tiene acceso a los campos del objeto y puede por lo tanto modificar los valores. Por el contrario, si el cdigo de la funcin modifica la referencia hacia el objeto, sta volver a ser establecida despus del retorno de la funcin. Hay que resaltar que todo este comportamiento es uniforme incluso si los campos de la clase estn declarados como p r i v a t e , porque estamos en el interior de la clase.

d. Los mtodos accesores


La declaracin de los atributos con una visibilidad privada es una buena prctica para respetar el principio de encapsulacin. Sin embargo, esta solucin es limitativa ya que slo el cdigo de la clase donde estn declarados puede acceder a ello. Para paliar este problema, debemos establecer unos mtodos accesores. Son funciones ordinarias que simplemente tienen como meta hacer visibles a los campos desde el exterior de la clase. Por convencin, las funciones encargadas de asignar un valor a un campo se llaman s e tseguido del nombre del campo, las funciones encargadas de proporcionar el valor del campo se llaman g e t seguido del nombre del campo. Si el campo es de tipo b o o l e a n , el prefijo g e tse sustituye por el prefijo i s . Si un campo debe ser de slo lectura, el accesor s e t no debe estar disponible; si un campo debe ser de slo escritura, entonces se debe omitir la funcin g e t . Con esta tcnica, podemos controlar el uso que se hace de los campos de una clase. Por lo tanto, podemos modificar la clase P e r s o n aal aadirle algunas reglas de gestin. El apellido se debe escribir en mayscula. El nombre se debe escribir en minscula. p u b l i cc l a s sP e r s o n a {
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 6/19

24/4/2014

ENI Training - Libro online

p r i v a t eS t r i n ga p e l l i d o ; p r i v a t eS t r i n gn o m b r e ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i ; p u b l i cS t r i n gg e t A p e l l i d o ( ) { r e t u r na p e l l i d o ; } p u b l i cv o i ds e t A p e l l i d o ( S t r i n ga ) { a p e l l i d o=a . t o U p p e r C a s e ( ) ; } p u b l i cS t r i n gg e t N o m b r e ( ) { r e t u r nn o m b r e ; } p u b l i cv o i ds e t N o m b r e ( S t r i n gn ) { n o m b r e=n . t o L o w e r C a s e ( ) ; } } Ahora, los campos de la clase son accesibles desde el exterior mediante estos mtodos.

p . s e t A p e l l i d o ( " g a r c a " ) ; p . s e t N o m b r e ( " j o s " ) ; S y s t e m . o u t . p r i n t l n ( p . g e t A p e l l i d o ( ) ) ; S y s t e m . o u t . p r i n t l n ( p . g e t N o m b r e ( ) ) ;

e. Constructores y destructores
Los constructores son mtodos particulares de una clase por diferentes aspectos. El constructor es un mtodo que lleva siempre el mismo nombre que la propia clase. No devuelve ningn tipo, ni siquiera v o i d . No se le llama nunca de manera explcita en el cdigo sino de manera implcita a la creacin de una instancia de clase. Como en el caso de un mtodo clsico, un constructor puede esperar parmetros. El constructor de una clase que no espera parmetros es designado como el constructor por defecto de la clase. El papel principal del constructor es la inicializacin de los campos de una instancia de clase. Como para los otros mtodos de una clase, tambin se puede sobrecargar los constructores. La creacin de un constructor por defecto no es obligatoria ya que el compilador proporciona uno automticamente. Este constructor efecta simplemente una llamada al constructor de la superclase que, por supuesto, debe existir. Al contrario, si su clase contiene un constructor sobrecargado, debe tambin poseer un constructor por defecto. Una buena costumbre consiste en crear siempre un constructor por defecto en cada una de sus clases. Aadimos constructores a la clase P e r s o n a .

p u b l i cP e r s o n a ( ) { a p e l l i d o = " " ; n o m b r e = " " ; f e c h a _ n a c i = n u l l ; } p u b l i cP e r s o n a ( S t r i n ga , S t r i n gn , G r e g o r i a n C a l e n d a rf ) { a p e l l i d o = a ; n o m b r e = n ;


http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 7/19

24/4/2014

ENI Training - Libro online

f e c h a _ n a c i = f ; } Los destructores son otros mtodos particulares de una clase. De la misma manera que los constructores, son llamados implcitamente pero nicamente durante la destruccin de una instancia de clase. Se impone la firma del destructor. Este mtodo debe ser p r o t e c t e d , no devuelve ningn valor, se llama obligatoriamente f i n a l i z e , no toma ningn parmetro y es susceptible de activar una excepcin de tipo T h r o w a b l e . Con motivo de esta firma impuesta, slo puede haber un nico destructor para una clase, y por lo tanto, la sobrecarga no es posible para los destructores. As pues, la declaracin de un destructor es la siguiente:

p r o t e c t e dv o i df i n a l i z e ( )t h r o w sT h r o w a b l e { } El cdigo presente en el destructor debe permitir la liberacin de recursos utilizados por la clase. En ello podemos encontrar, por ejemplo, cdigo que cierra un fichero abierto por la clase o el cierre de una conexin hacia un servidor de base de datos. Veremos en detalles en el prrafo Destruccin de una instancia, las circunstancias en las cuales se llama al destructor.

f. Campos y mtodos estticos


Los miembros estticos son campos o mtodos que son accesibles por la propia clase o por cualquier instancia de la clase. Tambin, en algunos lenguajes se habla de miembros compartidos. Son muy tiles cuando es necesario gestionar, en una clase, informacin que no es especfica a una instancia de la clase sino a la propia clase. En oposicin con los miembros de instancia para los cuales existe un ejemplar por instancia de la clase, los miembros estticos existen en un nico ejemplar. La modificacin del valor de un miembro de instancia slo modifica el valor para esta instancia de clase mientras que la modificacin del valor de un miembro esttico modifica el valor para todas las instancias de la clase. Los miembros estticos son asimilables a variables globales en una aplicacin. Son utilizables en el cdigo haciendo referencia a ello por el nombre de la clase o gracias a una instancia de la clase. No se aconseja esta segunda solucin ya que no demuestra el hecho de que estamos trabajando con un miembro esttico. Los mtodos estticos siguen las mismas reglas y pueden ser tiles en la creacin de bibliotecas de funciones. El ejemplo clsico es la clase M a t h ya que cuenta con un gran nmero de funciones estticas. Los mtodos estticos poseen sin embargo una limitacin, y es que slo pueden utilizar variables locales u otros miembros estticos de la clase. Nunca deben usar miembros de instancia de una clase porque puede ocurrir que el mtodo sea utilizado sin que exista una instancia de la clase. El compilador detectar esta situacin y lo indicar: n o n s t a t i cv a r i a b l ec a n n o tb er e f e r e n c e d f r o mas t a t i cc o n t e x t . Los miembros estticos deben ser declarados con la palabra clave s t a t i c . Como para cualquier otro miembro de una clase, podemos especificar una visibilidad. En cambio, una variable local a una funcin no puede ser esttica. Para ilustrar la utilizacin de los miembros estticos, vamos a aadir a la clase P e r s o n a un campo numrico. El valor de este campo se forma automticamente en la creacin de cada instancia de la clase y ser nico para cada instancia. Los constructores de nuestra clase estn perfectamente adaptados para llevar a cabo este trabajo. En cambio, tenemos que memorizar cuntas instancias han sido creadas para poder asignar un nico nmero a cada instancia. Una variable esttica privada se encargar de esta operacin. A continuacin, le presentamos el cdigo correspondiente.

p u b l i cc l a s sP e r s o n a
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 8/19

24/4/2014

ENI Training - Libro online

{ p r i v a t eS t r i n ga p e l l i d o ; p r i v a t eS t r i n gn o m b r e ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i ; / /c a m p op r i v a d or e p r e s e n t a n d oe ln m e r od el aP e r s o n a p r i v a t ei n tn u m e r o ; / /c a m p oe s t t i c op r i v a d or e p r e s e n t a n d oe lc o n t a d o rd eP e r s o n a s p r i v a t es t a t i ci n tn u m I n s t a n c i a s ; p u b l i cS t r i n gg e t A p e l l i d o ( ) { r e t u r na p e l l i d o ; } p u b l i cv o i ds e t A p e l l i d o ( S t r i n ga ) { a p e l l i d o=a . t o U p p e r C a s e ( ) ; } p u b l i cS t r i n gg e t N o m b r e ( ) { r e t u r nn o m b r e ; } p u b l i cv o i ds e t N o m b r e ( S t r i n gn ) { n o m b r e=n . t o L o w e r C a s e ( ) ; } / /m t o d od ei n s t a n c i ap e r m i t i e n d oo b t e n e re ln m e r od eu n aP e r s o n a p u b l i ci n tg e t N u m e r o ( ) { r e t u r nn u m e r o ; } / /m t o d oe s t t i c op e r m i t i e n d oo b t e n e re ln m e r od ei n s t a n c i a sc r e a d a s p u b l i cs t a t i ci n tg e t N u m I n s t a n c i a s ( ) { r e t u r nn u m I n s t a n c i a s ; } p u b l i cP e r s o n a ( ) { a p e l l i d o = " " ; n o m b r e = " " ; f e c h a _ n a c i = n u l l ; / / c r e a c i nd eu n an u e v aP e r s o n ayp o rl ot a n t o i n c r e m e n t a c i nd e lc o n t a d o r n u m I n s t a n c i a s + + ; / /a s i g n a c i nal an u e v aP e r s o n ad es un m e r o n u m e r o = n u m I n s t a n c i a s ; } }

g. Las anotaciones
Se utilizan las anotaciones para aadir informacin adicional a un elemento. Esta informacin no surte ningn efecto en el cdigo pero puede ser utilizada por el compilador, por la mquina virtual que se encargar de la ejecucin de la aplicacin o por ciertas herramientas de desarrollo. Se pueden aplicar a una clase, un campo, o a un mtodo. Debe ser especificada antes del elemento al cual se refiere. Una anotacin viene precedida por el smbolo @ y est seguida del nombre de la anotacin. El compilador reconoce tres tipos de anotaciones que van a permitir la modificacin de su comportamiento en el momento de la compilacin del cdigo.
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 9/19

24/4/2014

ENI Training - Libro online

@ D e p r e c a t e dse utiliza para indicar que un mtodo ya no debe ser utilizado. Es el caso, por ejemplo,
en el que decidimos hacer evolucionar un mtodo y deseamos que no se use ms la versin anterior. Esta anotacin no cambia el resultado de la compilacin pero aade informacin adicional al cdigo compilado. Si otra clase intenta usar este mtodo, un aviso es activado en el momento de la compilacin del cdigo de esta clase. Si aadimos esta anotacin al mtodo v i s u a l i z a c i n de la clase P e r s o n a , el cdigo que utiliza la clase P e r s o n ano debe llamar ms a este mtodo so pena de recibir un aviso en el momento de la compilacin.

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o ; p r i v a t eS t r i n gn o m b r e ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i ; p r i v a t ei n tn m e r o ; p r i v a t es t a t i ci n tn u m I n s t a n c i a s ; . . . @ D e p r e c a t e d p u b l i cv o i dv i s u a l i z a c i n ( ) { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+a p e l l i d o ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+n o m b r e ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; } . . . } La compilacin de una clase que contiene una llamada al mtodo v i s u a l i z a c i n de clase P e r s o n aactiva un aviso en la lnea que contiene esta llamada. la

j a v a cX l i n t : d e p r e c a t i o nP r i n c i p a l e . j a v a P r i n c i p a l e . j a v a : 1 6 :w a r n i n g :[ d e p r e c a t i o n ]v i s u a l i z a c i n ( )i n P e r s o n ah a sb e e nd e p r e c a t e d p . v i s u a l i z a c i n ( ) ; 1w a r n i n g Para obtener un mensaje detallado sobre los avisos, hay que utilizar la opcin Xlint:deprecation en el momento de la llamada del compilador.

@ O v e r r i d ese utiliza para indicar que un mtodo sustituye a otro heredado. Esta anotacin no es
obligatoria pero exige al compilador que verifique que la sustitucin se realiz correctamente (firma idntica de los mtodos en la clase bsica y en la clase actual). Si no es el caso, se activar un error de compilacin. El ejemplo siguiente sustituye el mtodo c a l c u l o E d a den una clase que hereda de la clase P e r s o n a(ms adelante se detallar la puesta en prctica de la herencia).

p u b l i cc l a s sC l i e n te x t e n d sP e r s o n a { @ O v e r r i d e p u b l i cl o n gc a l c u l o E d a d ( ) { . . . . . .
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 10/19

24/4/2014

ENI Training - Libro online

} } Esta clase se compil sin problema ya que el mtodo c a l c u l o E d a d tiene efectivamente la misma firma que la clase P e r s o n a . Por el contrario, si intentamos compilar el cdigo siguiente:

p u b l i cc l a s sC l i e n te x t e n d sP e r s o n a { @ O v e r r i d e p u b l i cl o n gc a l c u l o E d a d ( i n tu n i d a d ) { . . . . . . } } Obtenemos la respuesta siguiente de parte del compilador.

C l i e n t . j a v a : 6 :m e t h o dd o e sn o to v e r r i d eo ri m p l e m e n tam e t h o d f r o mas u p e r t y p e @ O v e r r i d e 1e r r o r Por supuesto tiene razn (hay que reconocer que siempre lleva razn!), le hemos anunciado nuestra intencin de sustituir el mtodo c a l c u l o E d a dy, en realidad, hemos efectuado una sobrecarga, ya que no existe un mtodo en la clase P e r s o n acon esta firma. Si quitamos la palabra clave @ O v e r r i d e , el cdigo se compila pero en este caso se trata de una sobrecarga.

@ S u p p r e s s W a r n i n g s ( " . . . , . . . " )indica al compilador que no genere ciertas categoras de avisos. Si por ejemplo deseamos usar discretamente un mtodo marcado como @ D e p r e c a t e d debemos utilizar
la anotacin siguiente en la funcin donde se encuentra la llamada a este mtodo.

@ S u p p r e s s W a r n i n g s ( " d e p r e c a t i o n " ) p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ) { P e r s o n ap ; p = n e wP e r s o n a ( ) ; p . v i s u a l i z a c i n ( ) ; } Este cdigo se compilar correctamente sin ningn aviso, hasta que el mtodo en cuestin desaparezca completamente de la clase correspondiente. En efecto, tenemos que tener en cuenta que la meta de la anotacin @ D e p r e c a t e d es desaconsejar el uso de un mtodo, con la posible intencin de hacerlo desaparecer en una versin posterior de la clase.

2. Utilizacin de una clase


La utilizacin de una clase en una aplicacin pasa por tres etapas: la declaracin de una variable que permite el acceso al objeto; la creacin del objeto;
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 11/19

24/4/2014

ENI Training - Libro online

la inicializacin de una instancia.

a. Creacin de una instancia


Las variables objeto son variables de tipo referencia. Se distinguen de las variables clsicas por el hecho de que la variable no contiene directamente los datos sino una referencia de la ubicacin en la memoria donde se encuentra la informacin. Al igual que en el caso de las variables de tipos primitivos, las instancias deben ser declaradas antes de su utilizacin. La declaracin se hace de manera idntica a la de una variable clsica (i n tu otra). P e r s o n ap ; Despus de esta etapa, la variable existe pero no referencia una ubicacin vlida. Contiene el valor n u l l . La segunda etapa consiste en crear la instancia de la clase. Se utiliza la palabra clave n e wa este efecto. Espera como parmetro el nombre de la clase cuya instancia est encargado de crear. El operador n e w hace una peticin para obtener la memoria necesaria para almacenar la instancia de la clase, luego inicializa la variable con esta direccin memoria. Entonces se llama al constructor de la clase para inicializar la nueva instancia creada. p = n e wP e r s o n a ( ) ; Se puede combinar las dos operaciones en una nica lnea. P e r s o n ap = n e wP e r s o n a ( ) ; En este caso, se llama al constructor por defecto. Para utilizar otro constructor, debemos especificar una lista de parmetros y, segn el nmero y el tipo de los parmetros, el operadorn e w llama al constructor correspondiente. P e r s o n ap=n e wP e r s o n a ( " G a r c a " , " j o s " , n e w G r e g o r i a n C a l e n d a r ( 1 9 5 6 , 1 2 , 1 3 ) ) ;

b. Inicializacin de una instancia


Es posible inicializar los campos de una instancia de clase de varias maneras. La primera consiste en inicializar las variables que forman los campos de la clase en el momento de sus declaraciones.

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o = " n u e v o A p e l l i d o " ; p r i v a t eS t r i n gn o m b r e = " n u e v o N o m b r e " ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i = n e w G r e g o r i a n C a l e n d a r ( 1 9 0 0 , 0 1 , 0 1 ) ; . . . . . . } Esta solucin, aunque muy sencilla, est bastante limitada ya que no es posible utilizar estructuras de control tales como un bucle exterior al bloque del cdigo. La solucin que nos viene en mente inmediatamente consiste en ubicar el cdigo de inicializacin en el interior de un constructor. En efecto, es una muy buena idea y es incluso el objetivo principal del constructor : inicializar las variables de instancia. Como contrapartida, se plantea un problema con los campos estticos ya que para ellos no es necesario disponer de una instancia de clase para poder utilizarlos. Por lo tanto, si ubicamos el cdigo encargado de inicializarlos en un constructor, nada nos garantiza que este ltimo
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 12/19

24/4/2014

ENI Training - Libro online

haya sido llamado al menos una vez antes de la utilizacin de los campos estticos. Para paliar este problema, Java propone los bloques de inicializacin estticos. Son simples bloques de cdigo precedidos por la palabra clave s t a t i c y delimitados por los caracteres { y } . Pueden aparecer en cualquier parte del cdigo de la clase y la mquina virtual los ejecuta en el orden en el que aparecen en el cdigo cuando se carja la clase. Podemos, por ejemplo, usar el cdigo siguiente para inicializar un campo esttico con un valor aleatorio superior o igual a 1000.

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o = " n u e v o A p e l l i d o " ; p r i v a t eS t r i n gn o m b r e = " n u e v o N o m b r e " ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i = n e w G r e g o r i a n C a l e n d a r ( 1 9 0 0 , 0 1 , 0 1 ) ; p r i v a t ei n tn m e r o = 0 ; p r i v a t es t a t i ci n tn u m I n s t a n c e ; s t a t i c { w h i l e ( n u m I n s t a n c e < 1 0 0 0 ) { n u m I n s t a n c e = ( i n t ) ( 1 0 0 0 0 * M a t h . r a n d o m ( ) ) ; } } . . . . . . } Se puede obtener el mismo resultado creando una funcin privada esttica y llamndola para inicializar la variable.

p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o = " n u e v o A p e l l i d o " ; p r i v a t eS t r i n gn o m b r e = " n u e v o N o m b r e " ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i = n e w G r e g o r i a n C a l e n d a r ( 1 9 0 0 , 0 1 , 0 1 ) ; p r i v a t ei n tn m e r o = 0 ; p r i v a t es t a t i ci n tn u m I n s t a n c e = i n i c C o n t a d o r ( ) ; p r i v a t es t a t i ci n ti n i c C o n t a d o r ( ) { i n tc p t = 0 ; w h i l e ( c p t < 1 0 0 0 ) { c p t = ( i n t ) ( 1 0 0 0 0 * M a t h . r a n d o m ( ) ) ; } r e t u r nc p t ; } . . . . . . } Esta solucin presenta la ventaja de poder utilizar la funcin en otra parte del cdigo de la clase. Se puede aplicar el mismo principio para la inicializacin de los campos de instancia. En este caso, el bloque de cdigo encargado de la inicializacin no debe ir precedido de la palabra clave s t a t i c . Este
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 13/19

24/4/2014

ENI Training - Libro online

bloque de cdigo es recopiado implcitamente al principio de cada constructor de la clase durante la compilacin. La inicializacin de un campo de instancia por la llamada a una funcin es tambin factible. En tal caso el desarrollador se encontrar con una sutil restriccin: el mtodo no debe ser sobrescrito en una subclase. Para ello, hay que declararlo con la palabra clave f i n a l .

c. Destruccin de una instancia


A veces la gestin de la memoria resulta ser un verdadero rompecabezas para algunos lenguajes de programacin. El desarrollador es responsable de la creacin de las instancias de clases pero tambin de su destruccin con el fin de liberar memoria. Afortunadamente, Java se encarga totalmente de la gestin y nos evita esta tarea fastidiosa. Determina por si mismo que un objeto ya no es utilizado en la aplicacin y entonces lo suprime de la memoria. Este mecanismo se llama Garbage Collector (Recolector de basura). Java considera que se puede suprimir un objeto cuando la aplicacin no puede acceder ms a ello. Esta situacin se produce, por ejemplo, a la salida de una funcin, cuando se utiliza una variable local para referenciar el objeto. Tambin puede ser provocada por la asignacin del valor n u l la una variable. Para borrar realmente un objeto de la memoria, es necesario que hayan desaparecido todos los medios de acceder a l desde la aplicacin. No hay que olvidar que si un objeto est almacenado en una coleccin o en un array, stos conservan una referencia hacia el objeto. Miremos un poco ms en detalle el funcionamiento del Garbage Collector. Existen varios algoritmos para poner en prctica el mecanismo de gestin de memoria. Los diseadores de la mquina virtual Java implementan estos mecanismos. Vamos a echarles un vistazo por pura curiosidad: Mark y Sweep Con este mecanismo, el Garbage Collector trabaja en dos etapas. Empieza con una exploracin de la memoria desde la raz de la aplicacin, el mtodo m a i n , y recorre as todos los objetos accesibles desde esta raz. Cada objeto accesible est marcado durante esta exploracin (Mark). Luego efecta un segundo recorrido durante el cual suprime todos los objetos no marcados y por lo tanto inaccesibles, y quita las marcas de los objetos que quedan y que puso durante el primer recorrido. Esta solucin rudimentaria presenta unos inconvenientes: Durante la primera etapa se interrumpe la ejecucin de la aplicacin. Su duracin es proporcional a la cantidad de memoria usada por la aplicacin. Despus de varios recorridos, hay riesgo de que la memoria quede fragmentada. Stop y Copy Esta solucin recorta en dos partes idnticas el espacio de memoria disponible para la aplicacin en marcha. En cuanto el Garbage Collector entra en accin, efecta, como para la solucin anterior, una exploracin de la memoria desde la raz de la aplicacin. En cuanto encuentra un objeto accesible, lo recopia hacia la segunda zona de memoria y modifica las variables para que referencien esta nueva ubicacin. Al final de la exploracin, todos los objetos accesibles han sido recopiados en la segunda zona de memoria. Entonces es posible borrar totalmente el contenido de la primera zona. Luego el mismo mecanismo se puede repetir ulteriormente con la zona de memoria que se acaba de liberar. Esta solucin presenta la ventaja de eliminar la fragmentacin de la memoria ya que los objetos son recopiados unos tras otros. Por el contrario, un inconveniente importante reside en el desplazamiento frecuente de los objetos que tienen un largo ciclo de vida en la aplicacin. Una solucin intermediaria consiste en repartir los objetos en la memoria segn su esperanza de vida o su edad. Por lo tanto, la mitad de la memoria disponible resulta a veces dividida en tres zonas: Una zona para los objetos que tienen una duracin de vida muy larga y que apenas tienen riesgo de desaparecer durante el funcionamiento de la aplicacin. Una zona para los objetos creados recientemente.
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 14/19

24/4/2014

ENI Training - Libro online

Una zona para los objetos ms antiguos. Cuando el Garbage Collector interviene, trata primero la zona reservada a los objetos recientes. Si despus de este primer barrido la aplicacin dispone de la memoria suficiente, el Garbage Collector detiene su tratamiento; hay que sealar que durante este primer barrido, puede transferir objetos que lleven tiempo existiendo, a la zona reservada a los objetos antiguos. Si la memoria disponible no es suficiente, realiza de nuevo el tratamiento por la zona reservada a los objetos ms antiguos. La eficacia de esta solucin reside en una constatacin cruel: los objetos Java no disponen de una gran esperanza de vida. As resulta muy fcil encontrar objetos para eliminar entre los creados recientemente. Entre estas dos soluciones, es difcil decir cul de las dos es ms utilizada por la mquina virtual ya que la implementacin del Garbage Collector corre a la libre eleccin del diseador de la mquina virtual. Antes de eliminar una instancia de la memoria, el Garbage Collector llama al destructor de esta instancia. El ltimo punto por aclarar en relacin con el Garbage Collector se refiere a su activacin. En realidad, le corresponde a la mquina virtual Java vigilar los recursos de memoria disponibles y provocar la entrada en accin del Garbage Collector cuando estos recursos han alcanzado un umbral limite (alrededor del 85 %). Sin embargo, es posible forzar la activacin del Garbage Collector al llamar al mtodo g c ( ) de la clase S y s t e m . Este uso debe resultar excepcional ya que una utilizacin demasiado frecuente castiga el rendimiento de la aplicacin. Se puede usar justo antes de que la aplicacin utilice una cantidad de memoria importante, como por ejemplo, la creacin de un array voluminoso. El cdigo siguiente permite resaltar la accin del Garbage Collector.

i m p o r tj a v a . u t i l . G r e g o r i a n C a l e n d a r ; p u b l i cc l a s sP e r s o n a { p r i v a t eS t r i n ga p e l l i d o = " n u e v o A p e l l i d o " ; p r i v a t eS t r i n gn o m b r e = " n u e v o N o m b r e " ; p r i v a t eG r e g o r i a n C a l e n d a rf e c h a _ n a c i = n e w G r e g o r i a n C a l e n d a r ( 1 9 0 0 , 0 1 , 0 1 ) ; p r i v a t ei n tn u m e r o = 0 ; p r i v a t es t a t i ci n tn u m I n s t a n c i a ; p u b l i cS t r i n gg e t A p e l l i d o ( ) { r e t u r na p e l l i d o ; } p u b l i cv o i ds e t A p e l l i d o ( S t r i n ga ) { a p e l l i d o=a . t o U p p e r C a s e ( ) ; } p u b l i cS t r i n gg e t N o m b r e ( ) { r e t u r nn o m b r e ; } p u b l i cv o i ds e t N o m b r e ( S t r i n gn ) { n o m b r e=n . t o L o w e r C a s e ( ) ; }

http://www.eni-training.com/client_net/mediabook.aspx?idR=65883

15/19

24/4/2014

ENI Training - Libro online

@ O v e r r i d e p r o t e c t e dv o i df i n a l i z e ( )t h r o w sT h r o w a b l e { S y s t e m . o u t . p r i n t ( " \ u 2 0 2 0 " ) ; s u p e r . f i n a l i z e ( ) ; } p u b l i ci n tg e t N u m e r o ( ) { r e t u r nn u m e r o ; } p u b l i cs t a t i ci n tg e t N u m I n s t a n c i a s ( ) { r e t u r nn u m I n s t a n c i a ; } p u b l i cP e r s o n a ( ) { a p e l l i d o = " " ; n o m b r e = " " ; f e c h a _ n a c i = n u l l ; n u m I n s t a n c i a + + ; n u m e r o = n u m I n s t a n c i a ; } p u b l i cP e r s o n a ( S t r i n ga , S t r i n gn , G r e g o r i a n C a l e n d a rf ) { a p e l l i d o = a ; n o m b r e = n ; f e c h a _ n a c i = f ; n u m I n s t a n c i a + + ; n u m e r o = n u m I n s t a n c i a ; } } / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / i m p o r tj a v a . u t i l . G r e g o r i a n C a l e n d a r ;

p u b l i cc l a s sG e s t i o n M e m o r i a { p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI n t e r r u p t e d E x c e p t i o n { d o u b l et o t a l ; d o u b l er e s t o ; d o u b l ep o r c e n t a j e ; f o r( i n tj = 0 ; j < 1 0 0 0 ; j + + ) { c r e a c i o n A r r a y ( ) ; t o t a l = R u n t i m e . g e t R u n t i m e ( ) . t o t a l M e m o r y ( ) ; r e s t o = R u n t i m e . g e t R u n t i m e ( ) . f r e e M e m o r y ( ) ; p o r c e n t a j e = 1 0 0 ( r e s t o / t o t a l ) * 1 0 0 ; S y s t e m . o u t . p r i n t l n ( " c r e a c i o nd e l"+j+" a r r a ym e m o r i al l e n aa :"+p o r c e n t a j e+" % ") ; / /u n ap e q u e ap a u s ap a r ap o d e rl e e rl o sm e n s a j e s T h r e a d . s l e e p ( 1 0 0 0 ) ; } }


http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 16/19

24/4/2014

ENI Training - Libro online

p u b l i cs t a t i cv o i dc r e a c i o n A r r a y ( ) { / /c r e a c i nd eu na r r a yd e1 0 0 0P e r s o n a se nu n av a r i a b l el o c a l / /a lf i n a ld ee s t af u n c i nl o se l e m e n t o sd e la r r a yy an oe s t n / /a c c e s i b l e sys ep u e d e ns u p r i m i rd el am e m o r i a P e r s o n a [ ]a r r a y ; a r r a y = n e wP e r s o n a [ 1 0 0 0 ] ; f o r( i n ti = 0 ; i < 1 0 0 0 ; i + + ) { P e r s o n a [ i ] = n e wP e r s o n a ( " G a r c a " , " j o s " , n e w G r e g o r i a n C a l e n d a r ( 1 9 5 6 , 1 2 , 1 3 ) ) ; } } }

3. Herencia
La herencia es una funcionalidad potente de un lenguaje orientado a objetos, pero a veces no se utiliza como se debe. Se pueden contemplar dos categoras de relaciones entre dos clases. Podemos tener la relacin es un tipo de y la relacin se trata de . La relacin de herencia debe ser utilizada cuando la relacin es un tipo de puede ser aplicada entre dos clases. Veamos un ejemplo con tres clases: P e r s o n a ,C l i e n t e ,C o m a n d o . Probamos la relacin es un tipo de para cada una de las clases. Un comando es un tipo de cliente. Un comando es un tipo de persona. Un cliente es un tipo de comando. Un cliente es un tipo de persona. Una persona es un tipo de cliente. Una persona es un tipo de comando. Entre todos estos intentos, slo uno nos resulta lgico: un cliente es un tipo de persona. Por lo tanto, podemos considerar una relacin de herencia entre estas dos clases. La puesta en prctica es muy sencilla a nivel del cdigo ya que en la declaracin de la clase, basta con especificar la palabra clave e x t e n d s seguida del nombre de la clase que se desea heredar. Al no aceptar Java la herencia mltiple, slo podemos especificar un nico nombre de clase bsica. En el interior de esta nueva clase, podemos: Utilizar los campos heredados de la clase bsica (con la condicin por supuesto de que su visibilidad lo permita). Aadir nuevos campos. Enmascarar un campo heredado declarndolo con el mismo nombre que el usado en la clase base. Se debe utilizar esta tcnica con moderacin. Usar un mtodo heredado en tanto su visibilidad lo permita. Sustituir un mtodo heredado al declararlo idntico (misma firma). Sobrecargar un mtodo heredado crendolo con una firma diferente. Aadir un nuevo mtodo. Aadir uno o varios constructores. A continuacin, presentamos el ejemplo de la creacin de la clase C l i e n t e que hereda de la
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 17/19

24/4/2014

ENI Training - Libro online

clase P e r s o n ay a la cual se aade el campo tipo y los mtodos accesores correspondientes.

p u b l i cc l a s sC l i e n te x t e n d sP e r s o n a { / /d e t e r m i n a c i nd e lt i p od ec l i e n t e / /P>p a r t i c u l a r / /E>e m p r e s a / /A>a d m i n i s t r a c i n p r i v a t ec h a rt i p o ; p u b l i cc h a rg e t T i p o ( ) { r e t u r nt i p o ; } p u b l i cv o i ds e t T i p o ( c h a rt ) { t i p o=t ; } } Ya se puede utilizar la clase y sta presenta todas clase C l i e n t e ms las heredadas de la clase P e r s o n a . las funcionalidades definidas en la

C l i e n t ec ; c = n e wC l i e n t e ( ) ; c . s e t A p e l l i d o ( " E N I " ) ; c . s e t N o m b r e ( " " ) ; c . s e t F e c h a _ n a c i ( n e wG r e g o r i a n C a l e n d a r ( 1 9 8 1 , 0 5 , 1 5 ) ) ; c . s e t T y p e ( E ) ; c . v i s u a l i z a c i n ( ) ;

a. this y super
A estas alturas parece legtimo querer modificar el funcionamiento de algunos mtodos heredados para adaptarlos a la clase C l i e n t e . Por ejemplo, se puede sustituir el mtodo v i s u a l i z a c i n para tener en cuenta el nuevo campo disponible en la clase.

p u b l i cv o i dv i s u a l i z a c i n ( ) { S y s t e m . o u t . p r i n t l n ( " a p e l l i d o :"+g e t A p e l l i d o ( ) ) ; S y s t e m . o u t . p r i n t l n ( " n o m b r e :"+g e t N o m b r e ( ) ) ; S y s t e m . o u t . p r i n t l n ( " e d a d :"+c a l c u l o E d a d ( ) ) ; s w i t c h( t i p o ) { c a s e P : S y s t e m . o u t . p r i n t l n ( " t i p od ec l i e n t e :P a r t i c u l a r " ) ; b r e a k ; c a s e E : S y s t e m . o u t . p r i n t l n ( " t i p od ec l i e n t e :E m p r e s a " ) ; b r e a k ; c a s e A : S y s t e m . o u t . p r i n t l n ( " t i p od ec l i e n t e :A d m i n i s t r a c i n " ) ; b r e a k ; d e f a u l t : S y s t e m . o u t . p r i n t l n ( " t i p od ec l i e n t e :D e s c o n o c i d o " ) ; b r e a k ; } }
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883 18/19

24/4/2014

ENI Training - Libro online

Este cdigo funciona muy bien, pero no respeta uno de los principios de la programacin orientada a objetos, a saber, reutilizar al mximo lo que ya existe. En nuestro caso ya tenemos una porcin de cdigo cargada de la visualizacin del apellido, del nombre y de la edad de una persona. Porqu no volver a utilizarla en el mtodo v i s u a l i z a c i nde la clase C l i e n t eya que heredamos de ella? As nuestro mtodo se convierte en lo siguiente:<

http://www.eni-training.com/client_net/mediabook.aspx?idR=65883

19/19

Вам также может понравиться