java - ventajas - variables locales y globales ejemplos
¿La variable local tiene el mismo nombre que la variable global? (1)
Soy consciente de que en determinadas circunstancias puede tener una variable global y una variable local que tienen el mismo nombre, como
int i = 0;
public Something(int i) {
this.i = i;
}
Sin embargo, estoy confundido con por qué esto funciona. Mi código se parece un poco a esto
TableRowSorter dataSorter; //Global Variable
public void setUpTable() {
//Some Code
dataSorter = new TableRowSorter(table.getModel());
table.setRowSorter(dataSorter);
DefaultRowSorter dataSorter = (DefaultRowSorter) table.getRowSorter(); //Local Variable
//Some More Code
}
¿Por qué se permite que DefaultRowSorter
tenga el mismo nombre de variable que TableRowSorter
?
En tu primer ejemplo:
Su exterior i
no es una "variable global", es una propiedad de instancia (a veces llamada una variable de instancia).
El código en su primer ejemplo funciona porque cuando usa un símbolo no calificado, se elige el que tiene el alcance más estrecho . (El que se declaró "más cercano" al código que lo usa). Por lo tanto, el i
no calificado de su constructor de Something
es el parámetro i
, y debe usarlo para acceder al campo de su instancia. Detalles de Gory en JLS§6.5.6.1: Nombres de expresiones simples .
Cuando no hay un identificador con un alcance más estrecho, puede omitir this.
para acceder a los campos (y métodos), pero no cuando hay un identificador conflictivo con un alcance más estrecho.
Ejemplo:
class Example {
private int a;
private int b;
Example(int a) {
// These work:
this.a = a;
this.b = 42;
// This also works and does the same thing as `this.b = 42;`
b = 42;
// This fails to set the instance field `a`, because it assigns the value
// of the `a` parameter to...the `a` parameter
a = a; // Doesn''t do what one probably wanted
}
}
En tu segundo ejemplo:
Puedes salir con éxito de this.
de la asignación al campo de instancia en la parte superior del método porque aún no ha declarado su variable local. En Java, una declaración de variable no entra en vigencia hasta que se alcanza (a diferencia de, digamos, el estilo antiguo de JavaScript donde var
se iza).
Entonces, hasta la DefaultRowSorter dataSorter = ...
línea, cuando se usa dataSorter
no calificado, se refiere al campo de instancia. Después de eso, se refiere a la variable local:
public class Example {
private int a;
public static final void main(String[] args) {
new Example().go();;
}
Example() {
this.a = 42;
}
void go() {
System.out.println(a); // 42, `a` is resolved to the instance field
int a = 67;
System.out.println(a); // 67, `a` is resolved to the local because it
// is "closer" to this code
System.out.println(this.a); // 42, because we qualified it
}
}
Obviamente recomiendo enfáticamente que no lo haga a propósito, pero estoy seguro de que ya planeabas no hacerlo. :-)