for if try等里面定义的变量只影响到所在的代码快里面。粗浅的理解方法就是{}中定义的只影响{}中间的。
上面的 ei 变量作用域包含 下面的for 循环块,会影响到for 循环块内,在for 循环块内再定义 ei ,则属于重复定义同名变量; 下面的 ei 定义在for 循环块内,它的作用域仅在 for 循环块内,不会影响到 for 循环块外面。
int ei = 5; for (int i = 0; i < 10; i++) { int ei = 10; } 这段代码必然会报错,因为你的ei在开始就定义了,当执行for循环时,出现重新定义的现象,当然会出现“ei已在前面定义"的错误。for (int i = 0; i < 10; i++) { int ei = 10; } int ei = 5; 这个不会报错是因为for循环里面的ei和外面的ei是两个变量,里面的ei作用域只在for循环里面有效,而外面的ei值一直是5,且不会报错。
这个你要看Java规范了 见chapter 6.4 Shadowing and Obscuring 里面说的是 Some declarations are not permitted within the scope of a local variable, formal parameter, exception parameter, or local class declaration because it would be impossible to distinguish between the declared entities using only simple names. 也就是说Java禁止出现在一个低级的作用域里声明使用一个“高级域”里的变量。所以下面这个也是编译错误的 public class Test { public static void main(String[] e) { int e = 10; } }
{ int ei = 5; } for (int i = 0; i < 10; i++) { int ei = 10; }这样子写也是对的。这里大概需要理解两个重要的概念,代码块和作用域,还有程序编译是从上往下扫描的。 上面两个ei的作用域都在{}内部。所以互不干扰,正确。 for (int i = 0; i < 10; i++) { int ei = 10; } int ei = 5; // ------------------------------------ 以下这个例子正确是因为,第一个ei的作用域在{}里面。而第二个ei的作用域,是从它定义开始往下都能其作用。 所以也不会出现重定义。
int ei = 5;//1 for (int i = 0; i < 10; i++) { int ei = 10;//报错是因为1处的代码依然有效, } //上面的代码报错是因为已经有一个ei的变量了,//--------------------------------------------------- for (int i = 0; i < 10; i++) { int ei = 10; } int ei = 5; 下面那个不报错是因为ei只是影响for循环里面,所以在外面再次定义是没有问题的。 作用域问题而已。
下面的 ei 定义在for 循环块内,它的作用域仅在 for 循环块内,不会影响到 for 循环块外面。
for (int i = 0; i < 10; i++) {
int ei = 10;
}
这段代码必然会报错,因为你的ei在开始就定义了,当执行for循环时,出现重新定义的现象,当然会出现“ei已在前面定义"的错误。for (int i = 0; i < 10; i++) {
int ei = 10; }
int ei = 5;
这个不会报错是因为for循环里面的ei和外面的ei是两个变量,里面的ei作用域只在for循环里面有效,而外面的ei值一直是5,且不会报错。
见chapter 6.4 Shadowing and Obscuring
里面说的是
Some declarations are not permitted within the scope of a local variable, formal
parameter, exception parameter, or local class declaration because it would be
impossible to distinguish between the declared entities using only simple names.
也就是说Java禁止出现在一个低级的作用域里声明使用一个“高级域”里的变量。所以下面这个也是编译错误的
public class Test {
public static void main(String[] e) {
int e = 10;
}
}
{
int ei = 5;
}
for (int i = 0; i < 10; i++) {
int ei = 10;
}这样子写也是对的。这里大概需要理解两个重要的概念,代码块和作用域,还有程序编译是从上往下扫描的。
上面两个ei的作用域都在{}内部。所以互不干扰,正确。
for (int i = 0; i < 10; i++) {
int ei = 10;
}
int ei = 5;
// ------------------------------------
以下这个例子正确是因为,第一个ei的作用域在{}里面。而第二个ei的作用域,是从它定义开始往下都能其作用。
所以也不会出现重定义。
int ei = 5;//1
for (int i = 0; i < 10; i++) {
int ei = 10;//报错是因为1处的代码依然有效,
}
//上面的代码报错是因为已经有一个ei的变量了,//---------------------------------------------------
for (int i = 0; i < 10; i++) {
int ei = 10;
}
int ei = 5;
下面那个不报错是因为ei只是影响for循环里面,所以在外面再次定义是没有问题的。
作用域问题而已。