вложенные области в Java - PullRequest
       11

вложенные области в Java

0 голосов
/ 17 октября 2018

когда мы пробуем этот код, он не работает.

public class f {

public static void main(String[] args) {
    { // aussen 
            int a = 1;
            int b = 2; 
             { // innen
                    System.out.println(a);
                    // gibt 1 aus
                    int b = 3;     
                    System.out.println(b); // gibt 3 aus
            }       

    }
}
}   

Но наш проф.говорит, что во внутренней области видимости переменная может быть объявлена ​​снова, и что эта внутренняя декларация используется во внутренней области видимости для переменной b.Но в интернете http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/08/scope.html в разделе «переменная с тем же именем r размещается внутри внутренней области видимости» мы обнаружили, что наша ошибка допустима.Изменилось ли это за последние 9 лет?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Создание новой переменной с тем же именем во вложенной области действия называется теневым копированием переменных, и 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 говорит: «Это сбивает с толку, выберителучшие имена "и запрещает дублирование локальных переменных внутри одной функции.
0 голосов
/ 17 октября 2018

Это не изменилось.Java была разработана таким образом.Локальные переменные не могут быть скрыты другими переменными, определенными в той же функции.Причина заключается в согласованности, все внешние переменные также видны для внутренней области.

Это один из случаев, когда Java работает иначе, чем, например, C и C ++, которые позволяют переменным в одной и той же функции скрывать друг друга.

...