当一个变量超出范围时,它永远不能回到范围
我偶然发现了这个肯定,它改变了我对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章)
的在Java“范围”的定义是在这里:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3
但基本上你的理念是正确的。范围是您分配的名称具有含义的代码区域。
所以如果我在函数amIOutOfScope()。我会超出范围,因此肯定“当一个变量超出范围,它不能回到范围”是错误的? – PbxMan 2013-02-16 00:46:59
“你”不在范围之内。变量(或者实际上任何标识符)都有一个作用域(local/class/class static),我们说它在代码中的不同位置或范围内。 – 2013-02-16 00:50:34
也许你被你的术语绊倒了..你不会超出范围。当您调用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.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
私人/公共/包专用
什么是整个文件,但只有文件访问。这类似于C的static
。
任何标有public
的内容均可从任何文件访问。这类似于来自C的extern
。
任何未标记的内容,例如int x;
被视为包私有。这意味着同一个包(文件夹)中的任何文件都可以访问它。因此,如果我在x.y
包中有Foo.bar()
,包x.y
中的任何其他类都可以调用Foo.bar()
,但x.z
中的类不能。
方法amIOutOfScope
只能看到方法中定义的变量,包括参数和类级变量。这里x
不符合该标准。
我没有看到真正的问题。 – 2013-02-16 00:42:18
http://en.wikipedia.org/wiki/Scope_%28computer_science%29 – 2013-02-16 00:44:15
http://www.cs.berkeley.edu/~jrs/4/lec/08 – user1428716 2013-02-16 00:46:24