Java 局部变量是否允许与全局变量同名?
我知道在某些情况下,可以有一个全局变量和一个局部变量,它们具有相同的名称,例如Java 局部变量是否允许与全局变量同名?,java,swing,jtable,Java,Swing,Jtable,我知道在某些情况下,可以有一个全局变量和一个局部变量,它们具有相同的名称,例如 int i = 0; public Something(int i) { this.i = i; } 然而,我不明白为什么会这样。我的代码看起来有点像这样 TableRowSorter dataSorter; //Global Variable public void setUpTable() { //Some Code dataSorter = new TableRowSorter(t
int i = 0;
public Something(int i) {
this.i = i;
}
然而,我不明白为什么会这样。我的代码看起来有点像这样
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
}
为什么允许DefaultRowSorter具有与TableRowSorter相同的变量名?在第一个示例中:
你的外部i不是一个全局变量,它是一个实例属性,有时称为实例变量
第一个示例中的代码之所以有效,是因为当您使用非限定符号时,会选择范围最窄的符号。声明最接近使用它的代码的那个。所以你的某物构造函数中的非限定i是i参数,你必须用它来访问你的实例字段。血淋淋的细节
当没有范围更窄的标识符时,可以忽略此项。访问字段和方法,但当存在范围较窄的冲突标识符时不访问
例如:
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
}
}
在第二个示例中:
你可以成功地离开这个。取消对方法顶部实例字段的赋值,因为您尚未声明局部变量。在Java中,变量声明在到达之前不会生效,这与(比如)挂起var的旧式JavaScript不同
因此,直到DefaultRowSorter dataSorter=。。。第行,当您使用dataSorter unqualified时,它引用实例字段。之后,它指的是局部变量:
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
}
}
显然,我强烈建议不要故意这样做,但我相信你已经计划不这样做了- 在您的第一个示例中:
你的外部i不是一个全局变量,它是一个实例属性,有时称为实例变量
第一个示例中的代码之所以有效,是因为当您使用非限定符号时,会选择范围最窄的符号。声明最接近使用它的代码的那个。所以你的某物构造函数中的非限定i是i参数,你必须用它来访问你的实例字段。血淋淋的细节
当没有范围更窄的标识符时,可以忽略此项。访问字段和方法,但当存在范围较窄的冲突标识符时不访问
例如:
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
}
}
在第二个示例中:
你可以成功地离开这个。取消对方法顶部实例字段的赋值,因为您尚未声明局部变量。在Java中,变量声明在到达之前不会生效,这与(比如)挂起var的旧式JavaScript不同
因此,直到DefaultRowSorter dataSorter=。。。第行,当您使用dataSorter unqualified时,它引用实例字段。之后,它指的是局部变量:
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
}
}
显然,我强烈建议不要故意这样做,但我相信你已经计划不这样做了- 哦,好的。谢谢你在这里纠正我的错误,但是我仍然不明白为什么第二个例子有效。谢谢你解释这一点。当我离开时,我会接受它can@Dan:很抱歉,第一次遗漏了第二个示例的要点。我还添加了一个更简单的示例,希望能在实际中演示它。哦,好的。谢谢你在这里纠正我的错误,但是我仍然不明白为什么第二个例子有效。谢谢你解释这一点。当我离开时,我会接受它can@Dan:很抱歉,第一次遗漏了第二个示例的要点。我还添加了一个更简单的示例,希望在实际操作中演示它。