Java 方法中的可变范围
这个问题来自著名的SCJP 6书Java 方法中的可变范围,java,scope,Java,Scope,这个问题来自著名的SCJP 6书 鉴于: public class Dark { int x = 3; public static void main(String[] args) { new Dark().go1(); } void go1() { int x; go2(++x); } void go2(int y) { int x = ++y; System.
public class Dark {
int x = 3;
public static void main(String[] args) {
new Dark().go1();
}
void go1() {
int x;
go2(++x);
}
void go2(int y) {
int x = ++y;
System.out.println(x);
}
}
结果如何
A.2B.3
C.4
D.5
E.编译失败
F.在运行时引发异常
我的问题是为什么go1()不能在这里的第4行使用初始化为6的实例变量x?,因为局部变量x存在。如果
intx如果代码>被注释掉,它将正常运行并使用实例变量。在Java中,所有局部变量都应初始化,否则将给出错误。但不应该初始化方法的参数
如果您没有intx
,那么这就可以了。因为在这种情况下,编译器将使用为类级别分配的局部变量。go1()
定义了一个名为x
的局部变量,它隐藏了实例变量x
。本地x
尚未初始化,因此编译错误。@GriffeyDog实际上在Java中,隐藏“仅适用于本来会被继承但不是因为子类中的声明而被继承的成员”。这是azurefrog的一个例子,我意识到了这一点。我试图使用初学者可能更容易理解的术语。在这种情况下,这也许不是最好的选择。