Java 当一个变量超出范围时,它永远不能回到范围内

Java 当一个变量超出范围时,它永远不能回到范围内,java,scope,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

我无意中得到了这个肯定,它改变了我对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题。

Java范围的定义如下:


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

java中作用域的定义如下:


但基本上你的概念是正确的。作用域是您指定的名称有意义的代码区域。

方法变量作用域与JVM中的堆栈空间相关

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

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


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

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

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

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


当您从amIOutOfScope返回时,返回main方法的堆栈空间,其中变量x仍然存在…

我们可以将作用域分为两大类:

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

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

{
    //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。使用文件名还是对象名取决于它是否是静态的

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

以下是全局变量的示例:

public class Foo {
    public static int bar = 10;
    public static void main(String[] args) {
        System.out.println(bar);
    }
}
静止的 如果变量是静态的,则该变量对于该对象的所有实例都是常量。请记住,所有Java文件实际上都是对象

如果变量不是静态的,则该变量对于该对象的每个实例都是唯一的

但这并不是真正的范围

私有/公共/包私有 标记为private的任何内容都可以在整个文件中访问,但只能在文件中访问。这类似于C中的静态

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


未标记的任何内容,例如int x;被认为是包私有的。这意味着同一个包文件夹中的任何文件都可以访问它。因此,如果我在包x.y中有Foo.bar,包x.y中的任何其他类都可以调用Foo.bar,但x.z中的类不能。我们可以将范围分为两大类:

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

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

{
    //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。使用文件名还是对象名取决于它是否是静态的

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

以下是全局变量的示例:

public class Foo {
    public static int bar = 10;
    public static void main(String[] args) {
        System.out.println(bar);
    }
}
静止的 如果变量是静态的,则该变量对于该对象的所有实例都是常量。请记住,所有Java文件实际上都是对象

如果变量不是静态的,则该变量对于该对象的每个实例都是唯一的

但这并不是真正的范围

私有/公共/包私有 标记为private的任何内容都可以在整个文件中访问,但只能在文件中访问。这类似于C中的静态

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


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

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

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

我看不出有什么真正的问题。在那些新程序员会尝试一些东西来判断它是否有效,而不是仅仅在这里发布一个问题的日子里发生了什么?这里有一个快速提示:试试你发布的代码,看看你是否可以在AmiofScope内访问x。会发生什么?尝试和错误,尤其是基础知识,通常是最快的学习方式。这是概念认证考试题Ken,我知道如何使用调试器,但谢谢你,我看不到真正的问题。新程序员会尝试一些东西来判断它是否有效的那些日子发生了什么,而不是仅仅在这里发布一个问题?这里有一个快速提示:试试你发布的代码,看看你是否可以在AmiofScope内访问x。会发生什么?尝试和错误,尤其是基础知识,通常是最快的学习方式。这是概念认证考试题肯,我知道如何使用调试器,但如果我使用的是amIOutOfScope函数,谢谢你。因此,当一个变量超出范围时,它永远不能回到范围内的肯定是假的?你不在范围内,也不在范围外。变量或实际上任何标识符都有一个作用域本地/类/类静态,我们说它在代码中不同的位置是否在作用域中。也许你被术语绊倒了。。你没有超出范围。当您调用amIOutOfScope方法时,您会创建一个新的作用域堆栈框架,正如amit所说。然后执行线程转到该新范围。变量不在当前作用域中,但仍在您离开的作用域中,并且当您的方法返回时它将在那里。好吧,那么说您无法访问amIOutOfScope方法中的x是错误的,因为您超出了作用域?这将是一种奇怪的说法。人们通常会说变量超出范围,但也可以说变量不在同一范围内。我们大多数人认为范围就是我们所处的位置,变量要么是我们所处的位置,要么不是我们所处的位置。我承认这有点武断。所以如果我在函数amIOutOfScope中。因此,当一个变量超出范围时,它永远不能回到范围内的肯定是假的?你不在范围内,也不在范围外。变量或实际上任何标识符都有一个作用域本地/类/类静态,我们说它在代码中不同的位置是否在作用域中。也许你被术语绊倒了。。你没有超出范围。当您调用amIOutOfScope方法时,您会创建一个新的作用域堆栈框架,正如amit所说。然后执行线程转到该新范围。变量不在当前作用域中,但仍在您离开的作用域中,并且当您的方法返回时它将在那里。好吧,那么说您无法访问amIOutOfScope方法中的x是错误的,因为您超出了作用域?这将是一种奇怪的说法。人们通常会说变量超出范围,但也可以说变量不在同一范围内。我们大多数人认为范围就是我们所处的位置,变量要么是我们所处的位置,要么不是我们所处的位置。我承认这有点武断。