简单Java的棘手问题:变量范围

lix*_*ang 8 java

我不是java和C#的新手.我以为我理解变量范围的概念直到最近我在一次采访中被问到这个问题:

public class Q{ //starting y scope

    static int x = 11;
    private int y = 33; // Just added a “private” modifier to make it clearer.

    public static void main(String args[]){
        Q q = new Q();
        q.call(5);
    }

    public void call(int x){
        Q q = new Q();

        this.x = 22;
        y = 44;

        System.out.println("Output: " + Q.x);
        System.out.println("Output: " + q.x);
        System.out.println("Output: " + q.y);
    }

} //ending y scope
Run Code Online (Sandbox Code Playgroud)

定义此程序的输出.

我在采访中回答了这个问题,输出结果是运行时异常.根据我的理解,y被声明为private,而实例方法call()正试图访问另一个Q类实例的实例私有变量y.怎么会发生这种情况!?然而,错误地回答这个问题并没有太多影响我的采访,因为这是一种"棘手的基本"问题.但是,错误地回答意味着我多年的Java经验需要康复,这太糟糕了!

有人可以帮我解决这个问题吗?我将非常感激!

SLa*_*aks 24

您可以访问private自己类的成员,甚至可以访问该类的其他实例.

  • @SLaks,+ 1:访问修饰符控制哪些类/包具有访问权限,而不是哪些实例具有访问权限. (2认同)

Oli*_*rth 8

private只是意味着它不能被另一个类的对象访问,而不能被任何其他对象访问.因此,一个Q对象可以访问另一个Q对象的私有成员.

[ 请注意,如果这是非法的,这将触发编译器错误,而不是运行时异常.]


Jon*_*eet 6

私有变量可在声明类的程序文本中访问.只要代码在同一个类中,一个实例尝试访问另一个实例中的变量并不重要.

JLS部分6.6:

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.