我刚开始学习Java。我有一些初级问题。我不是很明白为什么在这种情况下:
int j = 5;
for (int j = 0; j < 10; j++) {
// do sth
}
我的编译器显示:“
j
变量在作用域中已经定义”。为什么第二个j
会有问题?我认为它应该只是遮盖了第一个。我刚开始学习Java。我有一些初级问题。我不是很明白为什么在这种情况下:
int j = 5;
for (int j = 0; j < 10; j++) {
// do sth
}
j
变量在作用域中已经定义”。为什么第二个j
会有问题?我认为它应该只是遮盖了第一个。j
两次:一次在for
循环外部,一次在内部。只需删除上面的那行代码,您就可以继续了。int i = 0;
{
int i = 2;
}
所以你有两个i
变量。当你引用i
时,你指的是哪一个?
Java编译器不允许在这里进行“遮蔽”。定义是模糊的,编译器正在警告你。
由于将标识符声明为方法、构造函数或初始化块的局部变量不能出现在具有相同名称的参数或局部变量的作用域内,因此以下程序会出现编译时错误:
class Test1 {
public static void main(String[] args) {
int i;
for (int i = 0; i < 10; i++)
System.out.println(i);
}
}
并从 JLS - 第6.3节中可以了解到以下信息:局部变量(§14.4),形式参数(§8.4.1),异常参数(§14.20)和本地类(§14.3)只能使用简单名称(§6.2)而不是限定名称(§6.6)。
某些声明不允许在局部变量、形式参数、异常参数或本地类声明的范围内,因为使用简单名称就无法区分已声明的实体。
再次强调。块(§14.4)中的局部变量声明的作用域是在该声明中出现的块的其余部分,从其自己的初始化程序开始,并包括在本地变量声明语句中向右的任何进一步声明器。
如果局部变量v的名称作为v的直接封闭方法、构造函数或初始化器块的局部变量重新声明,在v的范围内作为try语句中catch子句的异常参数,在v的范围内作为try-with-resources语句中的资源,则编译时错误。
Cause this is a duplicate local variable problem, You already define "j" variable before. Try this:
int i = 5;
for (int j = 0; j < 10; j++) {
// do sth
}
int j = 5; // this j is visible to whole method
for (int j = 0; j < 10; j++) {
// so still j is visible to this for loop and you can use it
// but you can't initialize it again
// do sth
}
j
两次。请按以下方式重写您的代码:for (int j = 0; j < 10; j++) {
// do sth
}
或
int j;
for (j = 0; j < 10; j++) {
// do sth
}
只有当其中一个变量是方法字段,另一个变量是局部变量时才会发生遮蔽。在您的情况下,两者都是局部变量,因此它们不能相互遮蔽。
如果两个局部变量共享作用域,则不能具有相同名称,就像不能具有相同名称的两个字段一样。
j
? - Maroun