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:很抱歉,第一次遗漏了第二个示例的要点。我还添加了一个更简单的示例,希望在实际操作中演示它。