当变量超出范围时,它永远不会回到范围内

时间:2013-02-16 00:40:12

标签: java scope

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

示例:

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认证Java助理学习指南 - 考试CX-310-019(McGraw-Hill,2009年,第5章)中的第6号认证考试问题,这一假设是正确的。

4 个答案:

答案 0 :(得分:3)

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

但基本上你的概念是正确的。范围是代码区域,您指定的名称具有含义。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分: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.variableobjectName.variable访问全局变量。您使用文件名还是对象名称取决于它是否为static

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

以下是全局变量的示例:

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

静态

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

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

这不是真正的范围

私人/公共/私人套餐

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

任何标有public的内容都可以从任何文件中访问。这类似于C的extern

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

答案 3 :(得分:0)

方法amIOutOfScope只能看到方法中定义的变量,包括参数和类级别变量。此处x不符合该标准。