Подтвердить что ты не робот

Являются ли локальные переменные в статических методах также статическими?

Мне интересно, станут ли все локальные переменные статичными, если объявить их статическим методом?

например:

  public static void A(){
        int x [] = {3,2};
        changeX(x);

        for (int i = 0; i< x.length; i++){
             System.out.println(x[i]);   // this will print -1 and 1
        }
  }
  private static void changeX(int[] x){
        x[0] = -1;
        x[1] =  1;
  }

Насколько я понимаю, Java всегда передается по значению, но почему состояние X изменилось после того, как мы сделали вызов changeX? Может ли кто-нибудь объяснить это, пожалуйста? и может ли кто-нибудь объяснить, как Java справляется со статическими переменными с точки зрения распределения памяти? и что произойдет, если мы передадим статическую переменную функции в качестве параметра (я знаю, что люди обычно этого не делают)

4b9b3361

Ответ 1

Ответ на большинство ваших вопросов "как и любая другая переменная".

Локальные переменные в статических методах являются только локальными переменными в статическом методе. Они не являются статическими, и они никоим образом не являются особенными.

Статические переменные хранятся в памяти, прикрепленной к соответствующим объектам Class; любые объекты, на которые ссылаются статические ссылочные переменные, просто живут в обычной куче.

Когда вы передаете статическую переменную методу в качестве аргумента... абсолютно ничего интересного не происходит.

Что касается сценария в вашем коде:

  • Представьте, что у вас есть игрушечный шар на струне (воздушный шар - это ваш объект массива, а строка - это ссылка на него, указанная в A().)
  • Теперь вы привязываете другую строку к воздушному шару и передаете эту строку другу (это именно то, что происходит, когда вы вызываете метод changeX(): строка является параметром метода и указывает на тот же объект. )
  • Затем ваш друг втягивает строку, берет черный маркер и рисует лицо на воздушном шаре (это похоже на метод changeX(), изменяющий массив).
  • Затем ваш друг развяжет свою строку, оставив только строку, прикрепленную к баллу (метод возвращается, и локальная переменная в changeX() выходит за пределы области видимости.)
  • Наконец, вы вращаетесь в строке и смотрите на воздушный шар: конечно, вы видите лицо (ваша процедура A() видит измененный массив.)

Это действительно так просто!

Ответ 2

Как указывали другие, переменные, которые являются локальными для МЕТОДА, являются такими же, как и любая другая переменная, объявленная в любом другом методе - они динамически распределяются и могут быть освобождены, когда метод возвращает переменную, больше не видны.

Однако, если вам нужны статические переменные, вам придется объявить их вне методов, как обычные статические переменные для класса. Если, по договоренности, вы оставляете их в покое, кроме как внутри этого конкретного метода, они имеют такой же эффект, как если бы они были статическими и локальными для метода. Просто не забудьте добавить комментарии к этому эффекту.

Ответ 3

Статические переменные хранятся в специальной области кучи, называемой "постоянным поколением".

Локальные переменные, декалированные в статическом методе, не имеют никакого отношения к тем, которые объявлены в нестационарном методе. Ссылки на объекты и примитивные переменные помещаются в стек. Когда вы создаете объект, хранилище выделяется в куче, когда этот код выполняется.