Java 方法中的可变范围

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.

这个问题来自著名的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.out.println(x);
        }
    }
    
    结果如何

    A.2
    B.3
    C.4
    D.5
    E.编译失败
    F.在运行时引发异常

  • 书中给出的答案是:

    ✓ E是正确的。在go1()中,局部变量x未初始化


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

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

    在Java中,所有局部变量都应初始化,否则将给出错误。但不应该初始化方法的参数


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

    go1()
    定义了一个名为
    x
    的局部变量,它隐藏了实例变量
    x
    。本地
    x
    尚未初始化,因此编译错误。@GriffeyDog实际上在Java中,隐藏“仅适用于本来会被继承但不是因为子类中的声明而被继承的成员”。这是azurefrog的一个例子,我意识到了这一点。我试图使用初学者可能更容易理解的术语。在这种情况下,这也许不是最好的选择。