我知道在某些情况下你可以拥有一个全局变量和一个具有相同名称的局部变量,例如
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
具有相同的变量名?
答案 0 :(得分:4)
您的外部i
不是"全局变量,"它是一个实例属性(有时称为实例变量)。
第一个示例中的代码有效,因为当您使用非限定符号时,会选择具有最窄范围的符号。 (使用它的代码声明"最接近")因此,i
构造函数中的不合格Something
是i
参数,您必须使用{ {1}}访问您的实例字段。 JLS§6.5.6.1: Simple Expression Names中的血腥细节。
当没有范围较窄的标识符时,您可以省略this
来访问字段(和方法),但是当存在范围较窄的冲突标识符时则不能。
示例:
this.
您可以成功地将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中,变量声明在达到之前不会生效(不像是旧的JavaScript,其中this.
被提升)。
直到 var
行,当您使用DefaultRowSorter dataSorter = ...
不合格时,它会引用实例字段。 之后,它引用了局部变量:
dataSorter
显然,我强烈建议不要故意这样做,但我确定你已经计划不这样做了。 : - )