Java变量的范围

时间:2014-07-14 08:45:09

标签: java scope

我不明白为什么这段代码的输出是10

package uno;

public class A
{
    int x = 10;
    A(){int x = 12; new B();}
    public static void main(String args[]){
        int x = 11;
        new A();
    }
    class B{
        B(){System.out.println(x);}
    }
}

此示例中的范围如何工作?为什么System.out.println(x);打印10?是因为指令System.out.println(x);超出了构造函数的范围:A(){int x=12; new B();}所以int x = 12只存在于那里但是当System.out.println(x);被调用时,x = 12不会生存长?那么在课程x中声明的第一个x=10A?如果课程x中有任何A怎么办?会打印11吗?

6 个答案:

答案 0 :(得分:3)

本地变量只能 从声明的方法中访问。考虑到这一点,可以重写代码以避免shadowing the member variables以及由此产生的混淆:

package uno;
public class A{
  // And instance member variable (aka field)
  int field_A_x = 10;
  A(){
    // A local variable, only visible from within this method
    int constructor_x = 12;
    new B(); // -> prints 10
    // Assign a new value to field (not local variable), and try again
    field_A_x = 12;
    new B(); // -> prints 12
  }
  public static void main(String args[]){
    // A local variable, only visible from within this method
    int main_x = 11;
    new A();
  }
  class B{
    B(){
      // The inner class has access to the member variables from
      // the parent class; but the field not related to any local variable!
      System.out.println(field_A_x);
    }
  }
}

(阴影成员变量总是可以用this.x表示法访问;但我建议不要遮蔽变量 - 选择有意义的名称。)

答案 1 :(得分:2)

int x = 10;

这有实例范围,A类的任何成员都可以“看到”这个。 B级看到了这一点。

int x=12;

这在您的A构造函数中具有局部范围。它只出现在A的构造函数中。

int x = 11; 

同样使用本地范围,这次是在main方法中。

System.out.println(x);是谁? B的构造函数B看到了什么? int x = 10;。 这就是为什么......

此外,,

public class A{
  int x = 10;
  A(){int x=12; new B(); System.out.println(x); //prints 12}
  public static void main(String args[]){
    int x = 11;
    System.out.println(x); // prints 11
    new A();
  }
  class B{
    B(){System.out.println(x); //prints 10, as in your example}
  }
}

答案 2 :(得分:0)

如果您遗漏第4行中的int,请尝试一下会发生什么:

package uno;
public class A{
  int x = 10;
  A(){x=12; new B();}
  public static void main(String args[]){
    int x = 11;
    new A();
  }
  class B{
    B(){System.out.println(x);}
  }
}

然后输出将为12,因为您没有初始化新的int x

答案 3 :(得分:0)

您的内部类无法看到您在A类的构造函数中定义的局部变量。这就是为什么x对于B来说是10。

编辑:Ninja'd

答案 4 :(得分:0)

如果您希望输出为x=12,只需更改

即可
A(){int x=12; new B();}  // remove int here

A(){x=12; new B();} 

它正在创建local variable,因为它是在方法中声明的。

删除构造函数中的新声明,将改变instance variable的值。

因此输出将为x=12

答案 5 :(得分:0)

发生的事情是变量阴影。查看http://en.wikipedia.org/wiki/Variable_shadowing

如果在本地方法中声明并初始化具有相同名称的变量,则该值仅在其定义的方法中使用。它不会更改全局变量变量。因此,设置int x = 11int x = 12不会更改x的全局值。但是在方法中,如果未定义变量,则使用全局值,因此在类B中打印x {s}的全局值。