当前位置: 技术问答>java相关
请教,关于JAVA中变量的作用域的问题!
来源: 互联网 发布时间:2015-06-23
本文导语: 下面的代码为什么可以通过编译呢~ --------------------------------------------------- // Demonstrate block scope class SDemo{ public static void main(String args[]){ int x; x = 10; if(x==10){...
下面的代码为什么可以通过编译呢~
---------------------------------------------------
// Demonstrate block scope
class SDemo{
public static void main(String args[]){
int x;
x = 10;
if(x==10){
int y = 20;
System.out.println("x and y: "+ x +" "+y);
x = y*2;
}
int y = 100;
System.out.println("x is "+x);
System.out.println(y);
}
}
----------------------------------------------------------
JAVA的作用域规则中不是说"内部作用域声明的变量与其包围作用域中声明的变量不能重名!"的吗?那为什么最后还能输出Y的值呢~它不是已经与代码块中的Y重名了吗?
请指教~
---------------------------------------------------
// Demonstrate block scope
class SDemo{
public static void main(String args[]){
int x;
x = 10;
if(x==10){
int y = 20;
System.out.println("x and y: "+ x +" "+y);
x = y*2;
}
int y = 100;
System.out.println("x is "+x);
System.out.println(y);
}
}
----------------------------------------------------------
JAVA的作用域规则中不是说"内部作用域声明的变量与其包围作用域中声明的变量不能重名!"的吗?那为什么最后还能输出Y的值呢~它不是已经与代码块中的Y重名了吗?
请指教~
|
请比较:
class SDemo{
public static void main(String args[]){
(1) int y;
...
if(x==10){
(2) int y = 20;
...
(3) }
y = 100;
...
(4) }
}
编译时将出错:
SDemo.java:8: y is already defined in main(java.lang.String[])
int y = 20;
^
解释:
局部变量的作用域(the scope of a local variable),比如例中的 y ,并非整个main函数,而是从其声明那一处(1)开始,至(4)结束。即在我的例子里,外部变量 y 的作用域是(1)到(4),而 if 中的 y 作用域为(2)到(3),因此出现重名错。
但再你的实例里,由于 if 外部的 y 声明在(3)之后,因此不出现作用域相互覆盖问题。
class SDemo{
public static void main(String args[]){
(1) int y;
...
if(x==10){
(2) int y = 20;
...
(3) }
y = 100;
...
(4) }
}
编译时将出错:
SDemo.java:8: y is already defined in main(java.lang.String[])
int y = 20;
^
解释:
局部变量的作用域(the scope of a local variable),比如例中的 y ,并非整个main函数,而是从其声明那一处(1)开始,至(4)结束。即在我的例子里,外部变量 y 的作用域是(1)到(4),而 if 中的 y 作用域为(2)到(3),因此出现重名错。
但再你的实例里,由于 if 外部的 y 声明在(3)之后,因此不出现作用域相互覆盖问题。
|
没错啊他的道理其实和
for(int i=0;i
for(int i=0;i