Академический Документы
Профессиональный Документы
Культура Документы
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.
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
{ 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.
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.
24/4/2014
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.
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.
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
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 :
24/4/2014
{ 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.
24/4/2014
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.
24/4/2014
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.
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 .
24/4/2014
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.
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
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
@ 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
} } 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:
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.
24/4/2014
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
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
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 .
24/4/2014
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.
http://www.eni-training.com/client_net/mediabook.aspx?idR=65883
15/19
24/4/2014
24/4/2014
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
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
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
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