我偶然发现了这个肯定,它改变了我对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号认证考试问题,这一假设是正确的。
答案 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.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;
都被视为包私有。这意味着同一个包(文件夹)中的任何文件都可以访问它。因此,如果我在Foo.bar()
包中有x.y
,则x.y
包中的任何其他类都可以调用Foo.bar()
,但x.z
中的类不能。{/ p>
答案 3 :(得分:0)
方法amIOutOfScope
只能看到方法中定义的变量,包括参数和类级别变量。此处x
不符合该标准。