1

我偶然发现了这个肯定,它改变了我对 Java 范围的概念。C 我的概念曾经是“范围是指可以访问已声明变量的代码部分” 有人对此有更清晰的引用吗?

例子:

public static void main(String[] args) {
    int x = 5;
    amIOutOfScope();        
    System.out.println("Am in the x variable scope again?");
}

private static void amIOutOfScope(){        
    System.out.println("am I outta scope? I can't access x here, Does it mean I'm outta scope?");
    //System.out.println(x);//wrong as hell
}

这个肯定是真的吗?如果是这样,当您转到 amIOutOfScope() 方法时会发生什么,您是否超出了变量 x 的范围?你会怎么称呼它?有人可以向我澄清一下吗?

更新: 这本书适用于 SCJA Sun Certified Java Associate Study Guide - Exam CX-310-019(McGraw-Hill,2009,第 5 章),取自认证考试第 6 题。

4

4 回答 4

4

java中“范围”的定义在这里:http ://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3

但基本上你的概念是对的。范围是您分配的名称有意义的代码区域。

于 2013-02-16T00:45:28.673 回答
0

方法变量范围与JVM中的堆栈空间有关...

所以这里 main 方法的堆栈空间有 x 变量......但是一旦它进入 amIOutOfScope() 方法......我们指的是不同的堆栈空间......其中变量不存在......

所以这并不意味着变量超出范围......

当您从 amIOutOfScope() 中返回时,您将返回到变量 x 仍然存在的 main 方法的堆栈空间中...

于 2013-02-16T00:46:23.437 回答
0

我们可以将范围分为两大类:

当地的

这些变量在函数中。它们只能从该函数中访问。

局部变量仅限于它们的封闭{},也称为块。在声明之前和某些赋值之前,它们也是不可访问的。我的意思是

{
    //aVar is not accessible here
    {
        //aVar is not accessible here
        Object aVar;
        //aVar access will not compile
        if(aCond()) aVar = new Object();
        //aVar access will not compile unless you did if(true)
        aVar = new Object();
        //aVar is accessible here
        {
            //aVar is accessible here
        }
        //aVar is accessible here
    }
    //aVar is not accessible here
}
{
    //aVar is not accessible here
}

不同的方法将是一组不同的括号,因此超出了范围。

除非...

全球的

全局变量始终可以在整个文件中访问。全局变量在函数之外,在类的块中声明,因此所有块都可以访问它们。全局变量可以通过:FileName.variable或访问objectName.variable。使用文件名还是对象名取决于是否使用static

此外,方法也受全局范围的影响。

下面是一个全局变量的例子:

public class Foo {
    public static int bar = 10;
    public static void main(String[] args) {
        System.out.println(bar);
    }
}

静止的

如果变量是,static那么它对于该对象的所有实例都是常量。(请记住,所有 Java 文件都是真正的对象)

如果变量不是static,那么它对于该对象的每个实例都是唯一的。

虽然这不是真正的范围

私有/公共/包私有

任何标记为 的private内容都可以在整个文件中访问,但只能访问该文件。这就像static来自 C.

任何标记的public内容都可以从任何文件中访问。这与extern来自 C的类似。

例如,任何未标记的内容都int x;被视为包私有。这意味着同一包(文件夹)中的任何文件都可以访问它。因此,如果我Foo.bar()在包中有,则包x.y中的任何其他类都x.y可以调用Foo.bar(),但不能调用x.z

于 2013-02-16T00:55:10.237 回答
0

方法amIOutOfScope只能看到方法内部定义的变量,包括参数和类级变量。这里x不符合那个标准。

于 2013-02-16T00:57:05.577 回答