Создание новой переменной с тем же именем во вложенной области действия называется теневым копированием переменных, и Java допускает это в нескольких случаях.Вот пример, где x
объявляется четыре раза во вложенных областях:
class MyTest {
String x = "class member";
void foo() {
System.out.println("x = " + x);
String x = "local variable";
System.out.println("x = " + x);
new Runnable() {
String x = "inner class member";
public void run() {
System.out.println("x = " + x);
String x = "inner local variable";
System.out.println("x = " + x);
}
}.run();
}
public static void main(String[] list) {
new test().foo();
}
}
Как видите, это уже несколько сбивает с толку.Это может привести к трудным ошибкам, когда вы случайно используете неправильную переменную, даже если код отлично подходит для другой области и компилируется без предупреждений.
Например, что должен делать этот код?
for(int i=0; i<10; i++) {
for(int i=0; i<10; i++) {
System.out.println(i);
}
}
- C ++ сказал бы: «Это должны быть две отдельные переменные»
- JavaScript сказал бы: «Это должна быть одна и та же переменная»
- Java говорит: «Это сбивает с толку, выберителучшие имена "и запрещает дублирование локальных переменных внутри одной функции.