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

问题描述:

我偶然发现了这个肯定,它改变了我对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的范围?你会怎么称呼它?有谁能向我澄清这件事吗?

UPDATE: 这afirmation是书SCJA Sun认证Java助理学习指南真正的 - 考试CX-310-019从认证考试题号6

采取(麦格劳 - 希尔,2009年,第5章)
+2

我没有看到真正的问题。 – 2013-02-16 00:42:18

+0

http://en.wikipedia.org/wiki/Scope_%28computer_science%29 – 2013-02-16 00:44:15

+0

http://www.cs.berkeley.edu/~jrs/4/lec/08 – user1428716 2013-02-16 00:46:24

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

但基本上你的理念是正确的。范围是您分配的名称具有含义的代码区域。

+1

所以如果我在函数amIOutOfScope()。我会超出范围,因此肯定“当一个变量超出范围,它不能回到范围”是错误的? – PbxMan 2013-02-16 00:46:59

+1

“你”不在范围之内。变量(或者实际上任何标识符)都有一个作用域(local/class/class static),我们说它在代码中的不同位置或范围内。 – 2013-02-16 00:50:34

+0

也许你被你的术语绊倒了..你不会超出范围。当您调用amIOutOfScope方法时,会发生什么情况是您创建了新的作用域(堆栈框架,如amit所示)。然后,“你”(执行线程)转到新的范围。该变量不在当前范围内,但仍在您留下的范围内,并且在您的方法返回时它将在那里。 – Gus 2013-02-16 00:51:18

方法在JVM中的堆栈空间的变量范围涉及...

所以这里主要方法的堆栈空间有x变量...但一旦进去amIOutOfScope()method..we指不同的堆栈空间....其中变量不存在....

所以它并不意味着变量出去的范围......

当你从amIOutOfScope()返回..你回去堆变量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.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;被视为包私有。这意味着同一个包(文件夹)中的任何文件都可以访问它。因此,如果我在x.y包中有Foo.bar(),包x.y中的任何其他类都可以调用Foo.bar(),但x.z中的类不能。

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