Ámbito de las variables
El ámbito (scope) de una variable define en qué lugar puede utilizarse.
Un pequeño resumen de lo visto hasta ahora:
- Las variables declaradas en una estructura de control se denominan variables de bloque.
- Las variables declaradas en un método se denominan variables locales.
- Las variables declaradas en una clase se denominan atributos.
Cada una de estas variables sólo existe dentro de su ámbito. Si una variable se define dentro de una estructura de control, esta sólo existe en esa estructura de control. Y así con las demás variables.
Ocultación de atributos
Dos variables declaradas en ámbitos anidados no pueden tener el mismo identificador porque se genera un error. Pero existe una excepción: cuando una variable local (los parámetros de entrada de un método funcionan como variables locales) en un método tiene el mismo identificador que el atributo de la clase. En este caso, la variable local tiene prioridad sobre el atributo. Esto provoca que al utilizar el identificador se acceda a la variable local y no al atributo.
class Ambito{
int edad; //atributo entero
void metodo(){
double edad; // Variable local. Oculta el atributo edad
edad = 8.2; // Se guarda este valor en la variable local
}
}
Objeto this
La palabra reservada this permite utilizar un atributo incluso cuando este está oculto por una variable local. Cuando se utiliza this dentro de una clase, esta referencia al objeto actual. Esto permite acceder al atributo oculto.
class Ambito{
int edad; //atributo entero
void metodo(){
double edad; // Variable local. Oculta el atributo edad
edad = 8.2; // Se guarda este valor en la variable local
this.edad = 30; // Se guarda este valor en el atributo
}
}
thisDentro de un método de una clase, cuando se haga referencia a un atributo o método del objeto se recomienda utilizar this aunque no exista conflicto con variables locales.
El operador this también se puede usar para llamar a métodos de la misma instancia. Esto es útil cuando queremos ser explícitos sobre a qué objeto estamos llamando el método, especialmente si hay una sobrecarga de métodos.
class Calculadora {
int sumar(int a, int b) {
return a + b;
}
int sumarTres(int a, int b, int c) {
return this.sumar(a, b) + c; // Usando this para llamar a sumar
}
}
La palabra this también se puede usar para pasar la instancia actual del objeto como argumento a otros métodos o constructores.
class Grupo {
String nombre;
Grupo(String nombre) {
this.nombre = nombre;
}
void mostrar(Grupo grupo) {
System.out.println("Grupo: " + grupo.nombre);
}
void mostrarMiGrupo() {
this.mostrar(this); // Pasando la instancia actual
}
}