方法中的变量作用域

Variable Scope in methods

问题出自著名的 SCJP 6 书

  1. Given:

    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);
        }
    }
    

    What is the result?

    A. 2
    B. 3
    C. 4
    D. 5
    E. Compilation fails
    F. An exception is thrown at runtime

书上的答案是:

✓ E is correct. In go1() the local variable x is not initialized.

我的问题是为什么 go1() 不能在这里使用第 4 行初始化为 6 的实例变量 x?

因为存在局部变量x。如果 int x; 被注释掉,它将 运行 正常并使用实例变量。

在Java中所有的局部变量都应该初始化,否则会报错。但是你不应该初始化方法的参数。

如果您没有 int x 那么这就可以了。因为在那种情况下,编译器将使用分配给 class 级别的局部变量。