constantes
"Amigo, ¿sabías que en Java no se pueden cambiar todas las variables?"
"¿Cómo es eso, Kim? De hecho, la misma palabra 'variable' habla de cambio".
"No hay duda de eso. Como muchos otros lenguajes de programación, Java tiene constantes , es decir, variables cuyos valores no se pueden cambiar . Y la misma palabra 'constante' habla de constancia".
"¿Y para qué sirven?"
“Por lo general, se usan para algún tipo de cosa fundamental como el número Pi
o la cantidad de días en los meses del año. Dicho esto, en principio, un programador puede convertir cualquier variable en constante, si él o ella decide que haciendo así es necesario".
"¿Te refieres a un nombre, color de un auto o nombre de un día de la semana?"
"Tienes la idea correcta. Cualquier cosa que no deba cambiarse".
"¿Y cómo se ven estas constantes en Java?"
"Java tiene una palabra clave especial para ellos: final
. Crear una variable inmutable tiene el mismo aspecto que crear una normal. La única diferencia es que antes del tipo de variable debe escribir la palabra final
, así:
final Type name = value;
"¿Qué sucede si creas una constante y luego intentas asignarle un valor diferente?"
"¡Esa es la pregunta correcta! Y la respuesta correcta es esta: si intenta asignar un valor diferente a una final
variable, entonces su programa simplemente no compilará".
"¿Qué pasa si declaras una final
variable pero no le asignas un valor?"
"No tiene sentido hacer esto, por lo que tampoco está permitido en Java. Una final
variable debe inicializarse cuando se declara, es decir, debe asignarle un valor. Hay una excepción a esta regla: puede mover la inicialización de una variable de clase estática en un constructor, pero lo aprenderá más adelante.
"Dicho esto, no todo lo que es final
es una constante. Para reducir la cantidad de palabras clave, los desarrolladores de Java usan la palabra final
para algo más que declarar constantes. final
También se puede aplicar a métodos e incluso clases. Los métodos declarados como final
no se pueden anular, y una clase declarada como final
no heredable”.
"Uh... ¿Anulado? ¿Heredado? ¿Qué idioma estás hablando ahora?"
"El lenguaje de la programación orientada a objetos. Muy pronto llegará a él. Hasta entonces, simplemente disfrute de la hermosa terminología".
"Está bien. Entonces, final
¿se puede poner antes de variables, clases y métodos, y esta palabra clave los hace inmutables en algún sentido?"
"Sí. Además, el final
modificador se puede agregar antes de cualquier variable: variables locales, parámetros de método, campos de clase y variables de clase estática.
"Aquí está lo importante que debe recordar: final
antes, el nombre de una variable es solo una protección contra cualquier cambio en esa variable . Si una variable almacena una referencia a un objeto, entonces el objeto aún se puede cambiar".
"No entiendo muy bien".
"Lo entenderás muy pronto. Aquí hay un ejemplo:
|
Creamos una matriz. Esto no está permitido: la data variable se declara como final . Pero puedes hacer esto. Y también esto. |
"Entendido. Eso es complicado".
constantes globales
"¿Qué crees que son las constantes globales?"
"Supongo que las constantes globales son probablemente como variables globales, ¿solo constantes?"
"Exactamente. Si necesita declarar constantes globales en su programa, cree variables de clase estáticas y conviértalas public
en y final
. Hay un estilo especial para los nombres de tales variables: están escritos en letras mayúsculas, con un carácter de subrayado que se usa para palabras separadas.
Ejemplos:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
Sombreado variable
"Como dije antes, no puede crear múltiples variables locales con los mismos nombres en un solo método. En diferentes métodos, puede hacerlo".
"¡Yo sé eso!"
"Pero lo que probablemente no sepa es que las variables de una clase y las variables locales de un método pueden tener el mismo nombre.
Ejemplo:
Código | Visibilidad variable |
---|---|
|
|
"En el add
método, declaramos una variable local llamada sum
. Hasta el final del método, oculta (o enmascara ) la sum
variable de instancia".
"Hmm... Diría que, en cierto sentido, este es el comportamiento esperado".
"Pero ese no es el final de la historia. Resulta que si una variable de instancia está sombreada por una variable local, todavía hay una manera de referirse a la variable de instancia dentro del método. Hacemos esto escribiendo la palabra clave antes de su this
nombre :
this.name
"Aquí hay un ejemplo donde el conflicto de nombres se resuelve con éxito:
Código | Visibilidad variable |
---|---|
|
|
Las variables count
y sum
están disponibles en todas partes con o sin la this
palabra clave. En las líneas donde la sum
variable local sombrea la sum
variable de instancia, sum
solo se puede acceder a la variable de instancia usando la this
palabra clave.
"Obviamente, tendré que practicar esto".
Te las arreglarás.
"¿Qué pasa si una variable de clase estática está sombreada en lugar de solo una variable de instancia (no estática)? ¿No puede acceder a ella a través de this
?"
"Tienes razón. Esta palabra clave no funcionará. Debes referirte a ella a través del nombre de la clase:
ClassName.name
Ejemplo:
Código | Visibilidad variable |
---|---|
|
|
"Presta atención: puedes acceder a las variables estáticas count
y sum
en todas partes con o sin usar el nombre de la clase Solution
como prefijo. En aquellas líneas donde la sum
variable local sombrea la sum
variable de instancia, el acceso a la sum
variable de clase solo es posible cuando se usa Solution
como prefijo.
Variables dentro de un for
bucle
"Y un hecho más pequeño pero interesante. También hay un lugar donde una variable se declara de una manera especial: estoy hablando dentro de un for
ciclo ". Normalmente, un for
bucle tiene una counter
variable entre paréntesis. ¿Y cuál será la visibilidad de esta variable? Después de todo, no está en el cuerpo del bucle. ¿Es todo el método? ¿O no?"
"Ya escuché algo sobre esto. Según tengo entendido, una variable declarada en el encabezado de un for
ciclo es visible solo en el cuerpo del ciclo y en el encabezado del for
ciclo ".
"Bien hecho, Amigo. Pero aún así, echa un vistazo a un ejemplo para reforzar este material:
Código | Visibilidad variable |
---|---|
|
|
"Entonces, ¿está diciendo que en mi código podría escribir varios bucles uno tras otro con una variable de contador con el mismo nombre, y no habría problemas?"
"No habría problemas. Aquí, mira:
Código | Visibilidad variable |
---|---|
|
|
GO TO FULL VERSION