我不明白为什么这段代码的输出是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=10
是A
?如果课程x
中有任何A
怎么办?会打印11
吗?
答案 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 = 11
或int x = 12
不会更改x的全局值。但是在方法中,如果未定义变量,则使用全局值,因此在类B
中打印x {s}的全局值。