domingo, 31 de enero de 2010

Bloques estáticos, variables estáticas, métodos estáticos ...


Variables estáticas, bloques estáticos ... en general, miembros estáticos de una clase, qué son y cómo se comportan ... veamos algo de esto ...

Técnicamente, los elementos estáticos (atributos, métodos) se denominan elementos de clase, porque son comunes a todos los elementos de la clase. Eso es lo que sucede con la variable x que se encuentra definida en la clase de la figura. Esta variable tiene asignado un valor y ese valor es 5 y es válido para TODAS LAS INSTANCIAS de la clase que se vayan a crear, es conveniente hacer notar que NO ES UNA CONSTANTE (debería tener el calificador final para que sea), es muy útil hacer esa distinción ;-)

Esta es una pregunta típica del examen de certidicación y apunta a demostrar el conocimiento de los elementos estáticos de una clase.

Vamos ahora al análisis de la pregunta para obtener la respuesta correcta:

Dado que, una de las alternativas, contempla la posibilidad de que haya un error en tiempo de ejeución se debe revisar si existe algún error en la lógica de programación .... debido a que sólo se crea un objeto anónimo (línea 13) y luego se imprime el valor de un atributo de clase y desde un método estático (regla de oro de los atributos estáticos) no se produce error en las únicas dos líneas con las que que cuenta el método main.

Analizando ahora la posible respuesta se tiene que en la línea 13 se crea un objeto anónimo lo que hace que se cargue el bloque estático definido dentro de la clase donde asigna 10 al valor del atributo de clase "x" y cuando termina de ejecutarse el bloque de inicialización (definido entre las líneas 8 y 10) eso hace que el valor del atributo sea 20. Luego, en la línea 14 se imprime en la salida estándar el valor del atributo de clase "x" y, por las razones que se acaban de explicar, imprime un 20. Por lo tanto, la alternativa correcta es C; ¿respuesta definitiva? .... SI, respuesta definitiva.

Como siempre, mi inquietud va más allá de conocer la respuesta correcta; así es que comienzo a plantearme las siguientes preguntas:

¿Qué salida genera si se elimina el bloque de inicialización? La respuesta acá es más o menos obvia, dado que simplemente se va a quedar con el valor asignado dentro del bloque estático, es decir, un 10.

Ahora, considerando nuevamente el bloque de inicialización ¿qué sucedería si la línea que imprime el valor de x se crea antes de crear el objeto anónimo? ... la respuesta es 10 ... ¿por qué? la razón es porque el bloque de inicialización se ejecuta cuando se crea una instancia de la clase y hasta ese momento sólo se ha ejecutado el bloque estático (una vez que se ha cargado la clase).

Bueno, creo que eso nos introduce un poco a averiguar un poco más acerca de los elementos estáticos de una clase ...

Saludos a todos los que se dieron la lata de leer hasta este punto :-)

Bye