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

12

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

например:

  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 имеет дело со статическими переменными с точки зрения распределения памяти? и что произойдет, если мы передадим статическую переменную в функцию в качестве параметра (я знаю, что люди обычно этого не делают)

Вы перепутали здесь пять различных концепций. Hot Licks
Это локальная или временная переменная. После того, как функция закончена, она не имеет смысла. Subs
Это не имеет смысла, так как static не имеет значения для локальных переменных. Они являются локальными, точка, будь то статический метод или метод экземпляра. Hovercraft Full Of Eels
Массив является объектом в Java. Ссылка на массив передается в changeX при его вызове, поэтому его элементы в массиве могут быть изменены внутри changeX. Don Li

Ваш Ответ

3   ответа
1

называемой «постоянная генерация».

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

2

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

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

22

как и у любой другой переменной.

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

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

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

Regarding the scenario in your code:

Imagine that you have a toy balloon on a string (the balloon is your array object, and the string is the reference to it declared in A().) Now you tie another string on to the balloon and hand that string to a friend (that's exactly what happens when you call the changeX() method: the string is the parameter of the method, and it points to the same object.) Next, your friend pulls in the string, takes a black marker and draws a face on the balloon (this is like the changeX() method modifying the array). Then your friend unties his string, leaving just your string attached to the balloon (the method returns, and the local variable in changeX() goes out of scope.) Finally you reel in the string and look at the balloon: of course, you see the face (your A() routine sees the changed array.)

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

но я думал, что Java всегда передается по значению peter
Можете ли вы объяснить приведенный выше код, почему состояние X изменилось после вызова этой функции? peter
@ user1389813: это не имеет ничего общего сstatic и все это связано с пониманием ссылочных переменных. Пожалуйста, прочитайте, что Java-ранчо говорит о переменных.
Это передача по значению, но для ссылочных переменных значением является сама ссылка.
@ user1389813 - Я добавил раздел в конце своего ответа, чтобы объяснить поведение вашего кода. Это на самом деле очень просто - не переоценивайте это.

Похожие вопросы